use*_*912 0 c++ qt thread-safety
我想知道这段代码有什么问题.有时我会得到脓毒症,有时候不会.这是我在更大的软件中遇到的一个问题,这个想法是只有一个线程同时执行MyClass :: print方法.即使有这个简单的例子,它也会因为分段错误而失败.代码有什么问题?我怎么解决这个问题?
谢谢!
#include <iostream>
#include <ctime>
#include <QMutex>
#include <QtConcurrentRun>
class MyClass : QThread {
public:
void print(std::string str) {
mutex.lock();
std::cout << "In some thread: " << str << "\n";
mutex.unlock();
}
private:
QMutex mutex;
};
int main() {
MyClass myCl;
for(int i=0; i < 10; i++) {
QtConcurrent::run(&myCl, &MyClass::print,std::string("bla"));
}
}
Run Code Online (Sandbox Code Playgroud)
在for产生它们的循环之后,您不会加入您的线程.
因此,该main()函数可能在所有线程完成之前结束.这将myCl超出范围,并且线程将尝试访问已被销毁的对象(特别是其mutex变量).这为您提供了未定义的行为.
如果您在退出之前加入线程main()(或者在任何main()线程仍在运行时找到任何其他不退出的方式),事情应该会变得更好.
| 归档时间: |
|
| 查看次数: |
814 次 |
| 最近记录: |