【发布时间】:2009-04-08 12:25:11
【问题描述】:
我想暂停一个线程,直到另一个线程完成初始化而不使用 pthread_join。 我尝试使用连接,但由于我们拥有一些异步线程间通信系统,它会导致死锁。 现在,我正在使用(自定义)锁来实现这一点。
在线程 1 中:
lock_OfflineWorker.Lock()
if (pthread_create(&tid0, NULL, RunOfflineWorker, NULL) != 0)
{
}
lock_OfflineWorker.TryLock();
lock_OfflineWorker.Unlock();
在线程 2 中:
bool OfflineWorker::Initialize()
{
lock_OfflineWorker.Unlock();
}
但这很不雅,我不太确定副作用(可能会再次陷入僵局)。 这个可以吗? 如果没有,是否有另一种方法来实现这一点(使用锁或其他方式)
编辑:忘记包含“RunOfflineWorker”功能
void* RunOfflineWorker(void* pData)
{
g_OfflineWorker.Initialize();
}
【问题讨论】:
-
OfflineWorker 进行初始化,然后继续进行其他一些工作,对吗?
-
是的。在实际函数的底部有一个返回。它执行一些心跳操作(库函数),但不执行任何繁重的操作
-
您不能(可移植地)从您锁定它的不同线程解锁 pthread 互斥锁。见opengroup.org/onlinepubs/007908775/xsh/pthread_mutex_lock.html。使用如下建议的条件变量。
-
@Doug:是的,但是你可以用 POSIX 信号量做同样的事情。我建议不要在这里使用条件变量;事实是发。仅在两次编辑不言自明后,才成功地做到了。
标签: c++ multithreading