我目前正在编写一种算法,其中主线程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开始。等等。
我的问题如下:
我试图用两个条件变量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)
//...
}