Как назначить задачу для каждого потока без принудительного использования c. Т.е. каждый поток должен выполнить некоторую работу после завершения первой работы? - PullRequest
0 голосов
/ 19 сентября 2018

Т.е. каждому потоку необходимо выполнить некоторую работу после завершения первой работы.Автоматически каждый поток должен взять на себя задачу и запустить код.Может ли кто-нибудь помочь с этим методом?

    #include <pthread.h>


    #define thread_count (4)
    pthread_t read_thread_id[thread_count ];

    float sum_Data[128]= {0,1,2,3.........128};
    float sub_Data[128]= {0,1,2,3.........128};
    float Out_Mem[128] ={0};




    void af_sum(float *a, float *b, float *c)
    {
       c=a+b;
       return 0;
    }

    void *Data_output(void *data)
    {
       int temp = (int) data;
       int k;

       if(temp==0)
       {
//assigning some task for thread 0
          for(k = 0; k < 32; k++)
          {
             af_sum(&sum_Data[k], &sub_Data[k], &Out_Mem[k]);
          }
       }
       else if(temp==1)
       {
//assigning some task for thread 1
          for(k = 32; k < 64; k++)
          {
             af_sum(&sum_Data[k], &sub_Data[k], &Out_Mem[k]);
          }
       }
       else if(temp==2)
       {
//assigning some task for thread 3
          for(k = 64; k < 96; k++)
          {
             af_sum(&sum_Data[k], &sub_Data[k], &Out_Mem[k]);
          }
       }
       else
       {
//assigning some task for thread 4
          for(k = 96; k < 128; k++)
          {
             af_sum(&sum_Data[k], &sub_Data[k], &Out_Mem[k]);
          }
       }

       return 0;

    }



    int main()
    {

       int i,k;
       for (i = 0; i < thread_count ; i++)
       {
          pthread_create (&read_thread_id[i], NULL, Data_output, (void *) i);
       }

       for (i = 0; i < AF_NUM_INSTANCE; i++)
       {
          pthread_join (read_thread_id[i], NULL);

       }

        return (0);
    }

Т.е. каждому потоку необходимо выполнить некоторую работу после завершения первой работы.Автоматически каждый поток должен взять задачу и выполнить код.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

В вашей задаче, похоже, у вас разные диапазоны k для каждого потока.Таким образом, вам не нужен мьютекс для вычисления значения k.Единственное, что нужно, это отправить начальное и конечное значение k для каждого потока, которое передается в функцию af_sum.

Поскольку мы не можем передать несколько аргументов функции потока, необходимо использовать структуру для группировки всехаргументы.Будет использовать указатель на структуру в качестве аргумента функции потока.

Необходимы следующие изменения

    typedef struct dataStruct
    {
            int start;
            int end;
    }dataStruct;

    void *Data_output(void *data)
    {
            dataStruct *D = (dataStruct *)data;
            for(int k = D->start; k < D->end; k++)
                af_sum(&sum_Data[k], &sub_Data[k], &Out_Mem[k]);
    }

    int main()
    {
         pthread_t read_thread_id[4];
         dataStruct D[4] = {{0, 32}, {32, 64}, {64, 96}, {96, 128}};
         int i;
         for (i = 0; i < thread_count ; i++)
         {
            pthread_create (&read_thread_id[i], NULL, Data_output, (void *) &D[i]);
         }

         for (i = 0; i < thread_count; i++)
         {
            pthread_join (read_thread_id[i], NULL);
         }
         return (0);
    }
0 голосов
/ 19 сентября 2018

Вы можете определить функцию, которая вызывается всеми потоками, чтобы забрать работу.Функция pick_work () использует мьютекс, чтобы каждый поток получал свою уникальную работу.Вот псевдокод:

int currWork = 0;

// Each thread calls pick_work() to figure out the work.  If the
// return value of pick_work() is < 0, the thread returns/exits.

// Returns index of work assgined to caller
// Returns -1 to indicate that there is no more work left.
int pick_work()
{
    int work_index = -1;
    pthread_mutex_lock(&mutex);
    if (currWork < MAX_WORKS) {
        work_index = currWork;
        currWork++;
    }
    pthread_mutex_unlock(&mutex);
    return work_index;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...