C Вопросы по pthread и struct

#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? и не следует ли создавать инструкцию в виде массива, поскольку существует «одна или более» инструкций для «одного и только» потока. Я должен использовать **, но я не очень хорош в ** =[