让父线程在初始化子线程后等待直到收到来自子线程的信号的最佳方法是什么?

问题描述 投票:0回答:1

在使用 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 会首先获得互斥体,因此行为是未定义的。我可以想出几种方法来解决这个问题,但我对其中任何一个都不满意:

  1. 获取互斥体之前在主线程中休眠。我认为这从技术上讲并不能保证孩子会赢得比赛,如果可以的话,我想避免在任何一个线程中睡觉。
  2. 放弃互斥体并在 while 循环中等待子进程更新信号变量。如果不需要的话,我不想浪费宝贵的时间来忙于等待。
  3. 将互斥锁所有权从父级转移给子级?我不确定这是否可能,而且看起来有点邪恶,但它可以解决问题,而无需睡觉或忙着等待。这个想法是在主线程中锁定互斥锁,然后在生成线程时将锁传递给子线程,这样就保证首先拥有锁。

还有哪些其他选择?该解决方案只需要与 Linux 和 GCC 配合使用。

c multithreading pthreads mutex
1个回答
0
投票

使用条件变量或其他可等待事件对象。

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.