作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我调用 joinThread 时,我偶尔会在 join 调用中抛出一个带有“无效参数”的 std::system_error
。该错误似乎仅在我使用 gcc 编译时才会出现,并且不能始终如一地重现,即它偶尔会发生并且不可预测。有谁知道什么可能导致这样的错误?
下面是我的代码的简化版本。
class exampleClass
{
public:
exampleClass()
{
}
~exampleClass()
{
joinThread();
}
void doWork()
{
joinThread();
workThread = std::thread(&exampleClass::threadFunction, this);
}
void joinThread()
{
if(workThread.joinable()) workThread.join();
}
protected:
void threadFunction()
{
std::cout << "Do something that requires time..." << std::endl
}
std::thread workThread;
}
任何帮助将不胜感激。
最佳答案
由于你没有提供示例,所以我只能从我自己的经验中讲出这个错误是在哪里发生的。为了避免此类错误,您应该考虑一些事项:
移动
您的帖子了吗?friend
方法或类是否尝试访问/使用/加入线程?我最近忘记将函数传递给线程,我默认构造了该函数以便稍后使用它。这是由于条件初始化过程而发生的。因此,关于上面的示例类:您的 workThread
默认是在构造 exampleClass
对象时构造的。仅当您调用 doWork()
时才会传递回调函数。您已确保线程仅在处于可连接状态时才被连接。当你的物体被毁坏时,这也是有保证的。因此,我能想到的最有可能失败的原因是,如果你在某个地方有一个 friend
。不过,您还没有将其放入示例中,但也许您忽略了这一点,因为您想呈现简化的形式。
也许也看看这里:http://cppatomic.blogspot.com/2018/05/modern-effective-c-make-stdthread.html可能有帮助。
关于c++ - 什么会导致可连接线程在调用 join 时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39208737/
我是一名优秀的程序员,十分优秀!