gpt4 book ai didi

c++ - Cygwin 下 std::thread 的意外结果

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:15 25 4
gpt4 key购买 nike

我不确定 std::thread 是否应该在 Cygwin 下工作。我找到的唯一帖子是几年前的,并且处理编译器错误。所以这个问题有点不同。

我正在将一个应用程序从 Linux 移植到 Cygwin。它使用 std::thread 的多个线程并且除了一件事之外工作:在一个地方调用 std::thread::detach() 抛出 参数无效,尽管 std::thread::joinable() 返回 true

我尝试构建一个示例:

#include<thread>
#include<iostream>
#include<mutex>
#include<condition_variable>

std::thread* t;
std::mutex m;
std::condition_variable cv;

void func(void)
try
{
std::cout << "func" << std::endl;
if (t->joinable())
{
std::cout << "t is joinable" << std::endl;
t->detach();
delete t;
std::unique_lock<std::mutex> lck(m);
cv.notify_all();
}
}
catch(std::exception& e)
{
std::cout << "exception in func: " << e.what() << std::endl;
}


int main(void)
{
try
{
std::unique_lock<std::mutex> lck(m);
t=new std::thread(&func);
cv.wait(lck);
std::cout << "func finished" << std::endl;
cv.wait(lck);
}
catch(std::exception& e)
{
std::cout << "exception in main: " << e.what() << std::endl;
}

return(0);
}

我在 Linux 上编译这个

g++ -std=c++0x -pthread example.cc

使用 gcc 版本 4.6.3。它产生

func
t is joinable
func finished

然后每次都会无限期地挂起,这是由于对 cv.wait() 的第二次不匹配调用而导致的预期行为。

我在 Cygwin 上编译

g++ -std=c++11 -pthread example.cc

使用 gcc 版本 4.9.3

有时显示上述行为,有时仅显示

func

然后以 0 退出。

所以我无法重现我原来的错误,而是得到了一些更不稳定的行为。

最佳答案

您发布的程序包含未定义的行为。有两个线程(mainfunc)竞相访问 t(即普通的非原子原始指针)。

包含未定义行为的程序会发生什么,包括(但不限于)鼻恶魔。所以 linux 和 cygwin 似乎都在这个意义上工作,只是鼻恶魔恰好属于不同的种类。

关于c++ - Cygwin 下 std::thread 的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33707676/

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