c – Parent不等待工作线程完成任务
在我的程序中,主线程创建4个(或更多)工作线程.在某些时候,父(主线程)必须等待工人才能完成一些计算.线程在无限循环上运行,所以我不能使用pthread_join(..,..)POSIX函数来等待工作完成.所以我使用全局计数器和条件变量.
主线程代码 unsigned jobs = 0; // global variable // global mutex and cv. They get initialised in my main. pthread_mutex_t counter_mutex; pthread_cond_t counter_cv; static void process(..){ jobs = myArray.size(); // I am using a function here that broadcasts a cv in order to // wake up the workers pthread_mutex_lock(&counter_mutex); // lock counter while (jobs > 0){ pthread_cond_wait(&counter_cv,&counter_mutex); // PARENT SHOULD GET STUCK HERE TILL WORKERS ARE DONE } // cout << "Workers are done" << endl; pthread_mutex_unlock(&counter_mutex); // unlock counter } 工人代码 extern unsigned jobs; extern pthread_mutex_t counter_mutex; extern pthread_cond_t counter_cv; void *run() { for (int i = 0;; i++) { // do some calculations here pthread_mutex_lock(&counter_mutex); // lock counter jobs--; if (jobs == 0){ pthread_cond_signal(&counter_cv); cout << "All jobs are done" << endl; } pthread_mutex_unlock(&counter_mutex); // unlock counter } } 问题是,有时我的主线程不会卡在条件变量中,以便等待工作者,这有时会导致分段错误.是否存在任何我无法看到的竞争条件并导致此问题? 解决方法
您的代码中存在明显的并发问题.为简单起见,假设我们有2名工人,还剩2个工作岗位.可能发生以下情况:
>作业计数设置为2 因此,您有两次比赛和/或segfalts的机会:在父级和仍然活跃的工作者中,忙于一项不存在的任务. 我认为如果你开始循环获取锁定,检查是否还有剩余的工作,并且预先减少作业数量,那么工作循环会更安全,这样同伴工作人员就会知道真正剩下的东西: void *run() { for (int i = 0;; i++) { pthread_mutex_lock(&counter_mutex); // lock counter if (jobs == 0){ pthread_cond_signal(&counter_cv); cout << "All jobs are done" << endl; } else jobs--; pthread_mutex_unlock(&counter_mutex); // unlock counter // do some calculations here } } 优点是工人只有在真正留下工作的情况下才能工作.唯一的麻烦就是父母被第一个失业的工人唤醒了.然而,其他工人仍然可以跑步. 如果这是一个问题,你可以例如维护一个仍然活动的作业的计数器,并使父循环打开(作业> 0 || active_jobs> 0) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |