gpt4 book ai didi

c++ - "pthread_cond_wait"没有等待主线程休眠,为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:57 25 4
gpt4 key购买 nike

我做了一个简单的实验来测试:

  1. 主线程创建一个子线程。
  2. 子线程等待主线程向条件变量发出信号。
  3. 主线程休眠 3 秒并发出“cond”信号。然后我希望子线程将从“cond_wait”中唤醒并打印。

代码:

#include <pthread.h>
#include <unistd.h>
#include <cassert>
#include <iostream>

using namespace std;
pthread_mutex_t mt;
pthread_cond_t cond;
pthread_t tid;
void* tf(void*arg){
pthread_mutex_lock(&mt);
pthread_cond_wait(&cond, &mt);
cout<<"After main thread sleeps 3 seconds\n";
return NULL;
}
int main(){
assert(0==pthread_mutex_init(&mt,NULL));
pthread_create(&tid,NULL,tf,NULL);
sleep(3);
pthread_cond_signal(&cond);
pthread_join(tid,NULL);//Is 2nd parameter useful?
pthread_cond_destroy(&cond);
return 0;
}

但实际上,子线程会一次性打印“After main thread sleep 3 seconds”。我哪里错了?

谢谢。

最佳答案

最重要的是,由于您将 C++ 标签附加到此问题,请使用 C++ 线程功能,而不是 pthread 库。不能保证您始终可以访问它(例如在 Windows 上),而 std::thread 被设计为跨平台并且免于使用 带来的一些烦恼pthread() 库的 C 接口(interface)

其次,初始化变量,C 和 C API 很烦人。第三,您需要考虑虚假唤醒,在条件变量 wait 周围放置一个 while 循环,并为其附加一个实际条件,例如

while (not_signalled) {
pthread_cond_wait(&cond, &mt);
}

可能发生的情况是您的线程被虚假唤醒然后结束,因为您没有 while 循环来防止虚假唤醒


工作的C++代码

#include <thread>
#include <iostream>
#include <chrono>

using std::cout;
using std::endl;

std::mutex mtx;
std::condition_variable cv;
bool has_signalled{false};

void th_function() {
// acquire the lock
auto lck = std::unique_lock<std::mutex>{mtx};

// loop to protect against spurious wakeups
while (!has_signalled) {
// sleep
cv.wait(lck);
}

cout << "Thread has been signalled" << endl;
}

int main() {
auto th = std::thread{th_function};

// sleep for 2 seconds
std::this_thread::sleep_for(std::chrono::seconds(2));

// signal and change the variable
{
std::lock_guard<std::mutex> lck{mtx};
has_signalled = true;
}

// signal
cv.notify_one();

th.join();
}

关于c++ - "pthread_cond_wait"没有等待主线程休眠,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44743258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com