将一项工作交给一个线程并等待它接受

时间:2013-01-24 01:06:51

标签: pthreads mutex

我的申请表如下: worker-threads在pthread_cond_wait()中初始化并开始等待 主线程连接到DB并开始一次将一行交给适当的工作人员

由于DB驱动程序内部,在提取当前行之前无法读取下一行,因此主线程必须等待工作者“接受”该行。

我通过在主线程中调用pthread_cond_wait()来实现这一点 - 等待来自worker的pthread_signal()。这在Linux和FreeBSD上运行得很干净 - 但通常在Linux上需要更长的时间。虽然我在FreeBSD上大约27秒内一直处理整个1.6M行,但在Linux上通常需要2分钟。除了有时,Linux框显示同一时间......

代码是从同一个源编译的,程序与同一个DB服务器进行通信。如果有的话,Linux盒子与数据库位于同一个局域网上,而FreeBSD机器则通过VPN连接(所以它应该有点慢)。但是,令我困扰的是Linux结果的广泛不一致,我怀疑线程协调......

以下是我现在所拥有的:

MAIN THREAD                               WORKER
--------------------------------------------------------------------------
get new row
figure out, which worker it belongs to    lock my mutex
lock the worker's mutex                   go into pthread_cond_wait
signal the worker                         extract the row's data
unlock the worker's mutex                 signal the main thread
go into pthread_cond_wait                 unlock the mutex
go on back to getting the next row        go on to process the row's data

有更好的方法吗?谢谢!

2 个答案:

答案 0 :(得分:0)

如果读下一行必须是串行的,为什么要将它委托给工人呢?由于主线程无论如何都必须等待,让主线程进行提取,并且只要行被充分提取到主机可以进入下一行就会发生切换。

除此之外,您需要提供代码,因为您的描述不完整,以及在没有代码的情况下提交的任何此类问题。

答案 1 :(得分:0)

看起来你的问题是你在没有在主线程中锁定互斥锁的情况下调用pthread_cond_wait()。这意味着存在一个竞争条件:如果工作线程被唤醒,提取数据并在之前发出条件,则父进行pthread_cond_wait(),唤醒将丢失。

你应该拥有的是与条件变量配对的一些共享状态,如下所示:

主线程

get_new_row();
worker = decide_worker();

pthread_mutex_lock(&mutex);

/* Signal worker that data is available */
flag[worker] = 1;
pthread_cond_signal(&cond);

/* Wait for worker to extract it */
while (flag[worker] == 1)
    pthread_cond_wait(&cond, &mutex):

pthread_mutex_unlock(&mutex);

工作线程

pthread_mutex_lock(&mutex);

/* Wait for data to be available */
while (flag[worker] == 0)
    pthread_cond_wait(&cond, &mutex):

extract_row_data();

/* Signal main thread that extraction is complete */
flag[worker] = 0;
pthread_cond_signal(&cond);

pthread_mutex_unlock(&mutex);