#c #struct #pthreads
#c #структура #pthreads
Вопрос:
Основная функция этого кода — получить количество счетчиков и потоков, создает счетчики, затем создает потоки, затем получает количество инструкций в каждом потоке (формат инструкции [счетчик] [рабочая функция] [повторение])
/* ============================================================================
* File-global variables
* ========================================================================== */
static int ncounters = 0;
static struct counter *counters = NULL;
static int nthreads = 0;
static int *ninstructions = NULL;
static struct instruction **instructions = NULL;
struct counter {
long long counter; /* to store counter */
};
/* counter value */
struct instruction {
struct counter *counter; /* pointer to counter */
int repetitions; /* number of repetitions */
void (*work_fn)(long long *); /* function pointer to work function */
};
/* ============================================================================
* Thread function
* ========================================================================== */
static void *
worker_thread(void *arg) {
(void)arg;
int Tcounter;
int Trepetition;
char Tfuntion;
scanf(" %d %c %d", amp;Tcounter, amp;Tfuntion, amp;Trepetition);
Как мне на самом деле сохранить эти три переменные, используя инструкции struct instruction **???
return NULL;
}
/* ============================================================================
* Main function
* ========================================================================== */
int
main(void) {
scanf(" %d", amp;ncounters);
int i;
if(counters = malloc(sizeof(struct counter)*ncounters)){
for( i=0; i < ncounters ;i ){
counters[i].counter = 0;
}
for( i=0; i < ncounters ;i ){
printf("%lldn", counters[i].counter);
}
}
scanf(" %d", amp;nthreads);
pthread_t threads[nthreads];
int ninst;
for( i=0; i < nthreads ;i ){
scanf(" %d", amp;ninst);
ninstructions = ninst;
for( i=0; i < ninstructions ;i ){
pthread_create(amp;threads[i], NULL, worker_thread, NULL);
}
}
free(counters);
return 0;
}
Корректна ли функция pthread_create?
int
main(void) {
scanf(" %d", amp;ncounters);
int i;
if(counters = malloc(sizeof(struct counter)*ncounters)){
for( i=0; i < ncounters ;i ){
counters[i].counter = 0;
}
}
scanf(" %d", amp;nthreads);
pthread_t threads[nthreads];
if(ninstructions = (int*)malloc(nthreads*sizeof(int)){
for( i=0; i < nthreads ;i ){
scanf(" %d", amp;ninstructions[i]);
int j;
for(j=0; i < ninstructions[i] ;j ){
pthread_create(amp;threads[j], NULL, worker_thread, NULL);
}
}
}
free(ninstructions);
free(counters);
return 0;
}
Я также попытался преобразовать ninstruction в array, если это правильно…
Комментарии:
1. где вы хотите что-то сохранить? вы должны каким-то образом передать правильную структуру потоку (а затем позаботиться о синхронизации)
2. Я хочу сохранить инструкцию в инструкции struct, используя формат инструкции struct **. допустим, входные данные равны 1 D 10, я хочу, чтобы структура инструкций сохранялась как counter = 1 , work_fn = Increment , reptitions = 10.
3. что ж, для доступа к инструкции struct** ppData было бы (*ppData)-> повторения .
Ответ №1:
Хорошо, следующая попытка. На этот раз в псевдокоде, поскольку это пахнет домашней работой…
struct instruction
{
long long counter;
int repetitions
};
main()
{
ask #threads
pthread_t threads[nthreads];
struct instruction intructions[nthreads];
while( i < nthreads )
{
pthread_create( amp;threads[i], NULL, threadMain, amp;instructions[i] );
}
i = 0
while ( i < nthreads )
{
//now wait until all threads have finished
pthread_join( threads[i], NULL );
}
}
void threadMain( void* arg )
{
struct instruction* pInstruction = (struct instruction*)arg;
char cFunctionCode;
enter protected section, otherwise all threads will ask at the same time
scanf(" %d %c %d", amp;pInstruction->counter, amp;cFunctionCode, amp;pInstruction->repetitions
leave protected section here
do youtr computes here
return;
)
Для защищенных разделов найдите мьютекс или семафор.
Ответ №2:
ОК. Я предполагаю, что вы хотите сделать следующее:
...
//create the instructions, which is missing.
// be carefull that instruction.counter is not allocated!!!
struct instruction instructions[ncounters];
...
pthread_create( amp;threads[i], NULL, worker_thread, amp;instructions[i] );
...
И в рабочем потоке
worker_thread( void* arg )
{
struct instruction* pInstruction = (struct instruction*)arg;
pInstruction->repetions = 42;
...
Я надеюсь, это то, что вы хотели…
Марио
Комментарии:
1. упс, int * ninstructions будут представлять собой динамически распределяемый массив размером n потоков, содержащий длины последовательностей для каждого потока.
2. Я не совсем понимаю аргумент = (struct instruction *); бит, извините.
3. этого не хватало в вашем сообщении 😉 . Остальное остается в силе, передайте его в качестве аргумента (четвертый аргумент для pthread_create) в worker_thread, и вы сможете получить к нему доступ в главном потоке.
4. worker_thread получает значение void* в качестве аргумента. Вы должны привести его обратно к правильному типу, чтобы вы могли получить доступ к своей инструкции struct
5. Мммм, так когда должна быть создана инструкция? в main или work_thread? и не следует ли создавать инструкцию в виде массива, поскольку существует «одна или более» инструкций для «одного и только» потока. Я должен использовать **, но я не очень хорош в ** =[