gpt4 book ai didi

c++线程不执行

转载 作者:行者123 更新时间:2023-11-30 03:32:58 26 4
gpt4 key购买 nike

thread1 函数似乎没有执行

   #include <iostream>
#include <fstream>
#include <thread>
#include <condition_variable>
#include <queue>

std::condition_variable cv;
std::mutex mu;
std::queue<int> queue;
bool ready;

static void thread1() {
while(!ready) {std::this_thread::sleep_for(std::chrono::milliseconds(10));}

while(ready && queue.size() <= 4) {
std::unique_lock<std::mutex> lk(mu);
cv.wait(lk, [&]{return !queue.empty();});

queue.push(2);
}
}

int main() {
ready = false;
std::thread t(thread1);

while(queue.size() <= 4) {
{
std::lock_guard<std::mutex> lk(mu);
queue.push(1);
}

ready = true;
cv.notify_one();
}

t.join();

for(int i = 0; i <= queue.size(); i++) {
int a = queue.front();
std::cout << a << std::endl;
queue.pop();
}

return 0;
}

在我的 Mac 上输出是 1 2 1 2 但在我的 ubuntu 上是 1 1 1。我正在使用 g++ -std=c++11 -pthread -o thread.out thread.cpp && ./thread.out 进行编译。我错过了什么吗?

最佳答案

这个:

for(int i = 0; i <= queue.size(); i++) {
int a = queue.front();
std::cout << a << std::endl;
queue.pop();
}

是未定义的行为。从 0 到 size 的 for 循环运行 size+1 次。我建议您以更惯用的队列样式编写此代码:

while(!queue.empty()) {
int a = queue.front();
std::cout << a << std::endl;
queue.pop();
}

当我在 coliru 上运行它时,我假设它运行某种 *nix 机器,我得到 4 个 1:http://coliru.stacked-crooked.com/a/8de5b01e87e8549e .

同样,您没有指定任何会强制每个线程运行一定次数的内容。无论哪种方式,您只能(尝试*)导致队列大小达到 4 的不变量。恰好是在我们运行它的机器上,线程 2 永远无法获取互斥体。

如果您添加更多工作或什至(仅出于教学目的)在不同点延迟,此示例将更有趣。模拟两个线程确实在做工作。如果您在不同的点添加 sleep ,您可以确保两个线程交替,但根据您添加它们的位置,您可能会在线程中断中看到 4 个元素的不变量!

*请注意,即使队列中的 4 元素不变量也不是真正的不变量。当队列中有 3 个元素时,两个 线程有可能(尽管不太可能)在同一时刻通过 while 条件。一个首先获取锁并推送,然后另一个。所以你可以在队列中得到 5 个元素! (如您所见,异步编程很棘手)。特别是当您拥有锁时,您确实需要检查队列大小才能使其正常工作。

关于c++线程不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43314518/

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