gpt4 book ai didi

C++11 std::thread join 在 Xcode 6 上因 system_error 异常和 SIGABRT 而崩溃?

转载 作者:太空狗 更新时间:2023-10-29 20:38:35 28 4
gpt4 key购买 nike

这是一个简单的线程跟踪程序。线程简单地打印前十个整数,然后是“线程完成”消息。

#include <iostream>
#include <vector>
#include <numeric>
#include <thread>

void f();

int main(int argc, const char * argv[]) {
std::thread t(f);

std::cout << "Thread start" << std::endl;

t.detach();
t.join();

std::cout << "Thread end" << std::endl;

return 0;
}

void f()
{
std::vector<int> a(10);
std::iota(a.begin(), a.end(), 0);

for(const int& i : a)
{
std::cout << i << std:: endl;
}
std::cout << "Thread is done." << std::endl;
}

然而,当它运行时,t.join 在 libc ABI 的某处抛出一个 std::__1::system_error 异常,导致程序以 SIGABRT 终止:

Thread start
0
1
2
3
4
5
6
7
8
9
Thread is done.
libc++abi.dylib: terminating with uncaught exception of type std::__1::system_error: thread::join failed: No such process

有时当它运行时,主线程中的异常发生在线程 t 运行之前(在同一个地方)(但它仍然如此):

Thread start
libc++abi.dylib: terminating with uncaught exception of type std::__1::system_error: thread::join failed: No such process
0
1
2
3
4
5
6
7
8
9
Thread is done.

最佳答案

问题是detachjoin有线程可连接的先决条件,并且两者都有可连接为假的后置条件。这意味着一旦你在一个线程上调用了一个,试图调用另一个是无效的。

其次,您所看到的不同行为是由于线程和主函数的执行时间所致。有时分离和连接直到线程运行之后才执行,有时它们运行之前,以及介于两者之间的任何东西。

关于C++11 std::thread join 在 Xcode 6 上因 system_error 异常和 SIGABRT 而崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30970123/

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