正确的算法来执行由多个线程

时间:2016-08-21 10:53:10

标签: c multithreading algorithm parallel-processing pthreads

我目前正在编写一种算法,其中主线程Thread_0管理用于执行有序任务序列{Thread_1,Task_2,Task_3, ...,Taskn}。每个任务Task_i由所有线程Tread_i i> 0执行,并且每个线程对Task_i的结论是Task_i + 1的执行的必要和充分条件。我的问题是线程池和主线程之间的同步。 首先,当创建每个线程时,主线程必须在创建下一个线程之前等待每个线程的初始化,因为传递给线程函数的指针所指向的数据必须在其内容被修改之前被线程复制。一旦所有线程都被初始化,主线程必须计算执行Task_0所需的一些值,而其他线程必须等待广播信号以Task_0开始。一旦Task_0完成,主线程必须 必须计算执行Task_1所需的其他值,其他线程必须等待广播信号从Task_1开始。等等。

我的问题如下:

  1. 此算法/问题是否具有特定名称?
  2. 似乎等待线程初始化很常见, 有一个标准程序吗?
  3. 这种算法必须使用障碍来实现吗?
  4. 我有一个想法来解决这个问题,为每个线程使用一个互斥锁, 但我想避免这种情况。
  5. 我试图用两个条件变量cv0和cv1以及一个互斥锁mx0来解决这个问题,但是这样可以避免线程并行工作:

    void* worker(void* data_in){
      lock mx0
      copy input data
      flag=1
      signal cv0
      wait for condition signal cv1 with mx0
      // Initialize Task 0
      read DataForTask0
      // do Task_0
      flag=1
      signal cv0
      wait for condition signal cv1 with mx0
      // Initialize Task_1
      //...
      //...
    }
    
    int main(){
      flag=0
      for(i=0;i<TNum;i++){
        lock mx0  
        data=CurrentValue(i);
        pthread_create(&threads[i],NULL,worker,(void*)&data);
        while(!flag0)
          wait for condition sigal cv0 with mx0
        flag=0
        unlock mx0
      }
      // Here all threads must be waithing for cv1
      lock mx0
      Initialize DataForTask0
      broadcast cv1
      counter=0
      do{
        flag=0
        while(!flag0)
          wait for condition signal cv0 with mx0
        counter++
      }while(counter<TNum)
      //...  
    }
    

0 个答案:

没有答案