我的应用程序有一个主线程,可以将任务分配给多个工作线程。沟通模式如下:
线程函数(work是一个函数指针):
while(true) {
pthread_mutex_lock(mutex);
while(!work)
pthread_cond_wait(cond, mutex); // wait for work...
pthread_mutex_unlock(mutex);
work();
pthread_barrier_wait(barrier); /*all threads must finish their work*/
if(thread_id == 0) {
work = NULL;
pthread_cond_signal(cond); /*tell the main thread that the work is done*/
}
pthread_barrier_wait(barrier); /* make sure that none of the other worker
threads is already waiting on condition again...*/
}
在主线程(将任务分配给工作线程的函数)中:
pthread_mutex_lock(mutex);
work = func;
pthread_cond_broadcast(cond); // tell the worker threads to start...
while(work)
pthread_cond_wait(cond, mutex); // ...and wait for them to finish
pthread_mutex_unlock(mutex);
我这里没有使用队列,因为一次只能有一个任务,主线程必须等待任务完成。该模式工作正常,但性能不佳。问题是,执行单个任务的任务很快就会被分配。因此,线程将经常挂起并等待该条件。我想减少pthread_mutex_(un)lock,phread_cond_wait和pthread_barrier的调用次数,但我不知道如何做到这一点。
答案 0 :(得分:0)
一次只能执行一项任务。
您不需要安排。你不需要线程。你可以摆脱锁定。