在使用 pthread_create 生成线程后,我希望父线程等待任意时间,直到子线程允许其继续。以下是我如何使用互斥锁来处理它:
pthread_mutex_t childLock;
void *childProcess()
{
pthread_mutex_lock(&childLock);
// do important initialization
pthread_mutex_unlock(&childLock);
// do some parallel processing
}
int main()
{
pthread_t childThread;
pthread_create(&childThread, 0, childProcess);
pthread_mutex_lock(&childLock); // wait here for child initialization
// do some parallel processing
pthread_join(childThread, 0);
return 0;
}
这里的问题是不能保证 childProcess 会首先获得互斥体,因此行为是未定义的。我可以想出几种方法来解决这个问题,但我对其中任何一个都不满意:
还有哪些其他选择?该解决方案只需要与 Linux 和 GCC 配合使用。
使用条件变量或其他可等待事件对象。
std::conditional_variable cvInit;
std::mutex cvMutex;
void *childProcess()
{
std::lock_guard<std::mutex> lk(cvMutex);
// do important initialization
cv.notify_one();
// do some parallel processing
}
int main()
{
pthread_t childThread;
pthread_create(&childThread, 0, childProcess);
// wait here for child initialization
std::unique_lock<std::mutex> lk(cvMutex);
cv.wait(lk);
// do some parallel processing
pthread_join(childThread, 0);
return 0;
}