我的申请表如下: 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
有更好的方法吗?谢谢!
答案 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);