通过自己的条件变量 c++ 控制每个线程
Control each thread by it's own condition variable c++
我正在尝试创建一个有一个主线程和多个工作线程的程序。工作线程将自己注册在一个共享队列中,并等待主线程的信号继续前进。主线程将检查队列的前面,并使用它自己的特定条件变量向该线程发出信号,继续前进。以下是我现在拥有的伪代码,
struct condition{
pthread_cond_t cond_var;
pthread_mutex_t lock;
};
queue<condition> queue;
pthread_mutex_t lock;
pthread_cond_t cond;
void *Master()
{
while(/* some condition*/)
{
pthread_mutex_lock( &lock );
condition next_obj;
if(!queue.empty())
{
next_obj = queue.front();
landing_queue.pop();
pthread_cond_signal( &next_obj.cond_var );
}
pthread_cond_broadcast( &cond );
pthread_mutex_unlock( &lock );
sleep(2 sec);
}
pthread_exit(NULL);
}
void *Woker()
{
condition new_obj;
pthread_mutex_init(&new_obj.lock, NULL);
pthread_cond_init(&new_obj.cond_var, NULL);
pthread_mutex_lock( &new_obj.lock );
pthread_mutex_lock( &lock );
pthread_cond_wait( &cond, &lock );
queue.push(new_obj);
pthread_cond_broadcast( &cond );
pthread_mutex_unlock( &lock );
pthread_cond_wait( &new_obj.cond_var, &new_obj.lock );
pthread_exit(NULL);
}
在这段代码中,structcondition保存特定线程的条件变量和锁,我通过它自己的cond_var和存储在structcondition中的锁来锁定工作线程,然后在主线程中使用队列中相同的存储锁和cond_var来解锁它。现在一切都很好,但主线程给工作线程的信号不起作用,即使在主线程发送信号后,工作线程仍在等待。请告诉我,如果流程有问题,或者是否有其他方法可以实现这一点。
光有条件变量和互斥是不够的:条件变量需要与某个共享状态上的条件配对(因此得名)。一个简单的例子是用一个标志变量来扩充condition
结构:
struct condition {
pthread_cond_t cond_var;
pthread_mutex_t lock;
int flag;
};
其中flag
变量由lock
互斥对象保护。
然后,工作线程可以使用条件变量来等待flag
的设置:
void *Woker()
{
condition new_obj;
pthread_mutex_init(&new_obj.lock, NULL);
pthread_cond_init(&new_obj.cond_var, NULL);
new_obj.flag = 0;
/* publish new_obj to queue */
pthread_mutex_lock(&lock);
queue.push(new_obj);
pthread_mutex_unlock(&lock);
/* Wait for flag to be set */
pthread_mutex_lock(&new_obj.lock);
while (!new_obj.flag)
pthread_cond_wait(&new_obj.cond_var, &new_obj.lock);
pthread_mutex_unlock(&new_obj.lock);
pthread_exit(NULL);
}
并且您的主线程将设置标志并发出条件信号:
pthread_mutex_lock(&next_obj.lock);
next_obj.flag = 1;
pthread_cond_signal(&next_obj.cond_var);
pthread_mutex_unlock(&next_obj.lock);
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何从单独的线程控制 SFML 窗口?
- 控制多线程程序中的输出流
- 控制不同的硬件:多线程或不同的东西
- 通过自己的条件变量 c++ 控制每个线程
- 如何防止线程使用的对象被丢弃?如何控制对象的生存期
- 使用condition_variable控制多线程流
- 控制对多线程程序中字符串对象的访问的最佳方法
- 有没有办法控制英特尔线程构建模块中的线程数量、亲和力和创建时间
- c++:使用多线程在控制台中移动光标
- 在工作线程完成MFC时禁用控制变量
- 从您无法控制且无权访问的线程中释放 Python 导入锁