我之前询问过如何在不使用pthread_join的情况下同步两个线程,我可以使用pthread_cond_wait和pthread_cond_signal来解决它.我写了一个小结构来将这个功能捆绑到一个地方:
struct ConditionWait
{
int i_ConditionPredicate;
pthread_mutex_t lock_Var;
pthread_cond_t cond_Var;
int i_ValidResult;
ConditionWait()
{
pthread_mutex_init(&lock_Var, NULL);
pthread_cond_init(&cond_Var, NULL);
i_ValidResult = 1;
i_ConditionPredicate = 0;
}
void Signal()
{
pthread_mutex_lock(&lock_Var);
i_ConditionPredicate = i_ValidResult;
pthread_cond_signal(&cond_Var);
pthread_mutex_unlock(&lock_Var);
}
void Wait()
{
pthread_mutex_lock(&lock_Var);
while(i_ConditionPredicate != i_ValidResult)
{
pthread_cond_wait(&cond_Var, &lock_Var);
}
pthread_mutex_unlock(&lock_Var);
}
};
Run Code Online (Sandbox Code Playgroud)
假设我从两个不同的线程调用Wait()和Signal(),这将是线程安全的.在同一个对象的两个函数中使用相同的锁会导致死锁或竞争条件吗?
编辑:我现在在我的程序中使用它,它工作正常.我不太确定这是不是运气
这只会工作一次,在你唤醒线程等待之后,下一次尝试等待将全部成功并且永远不会阻塞,因为你永远不会"重置"条件谓词.如果这是您想要的(或者在您的情况下无关紧要)那么是的,这是安全的,并且通常使用条件变量.
PS:您还应该使用pthread_mutex_destroy(),并pthread_cond_destroy()在这件事的析构函数.
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |