C++ 使用QtConcurrent::run()修改成员变量?
假设我有一个类C++ 使用QtConcurrent::run()修改成员变量?,c++,multithreading,qt,C++,Multithreading,Qt,假设我有一个类MyClass,它包含一个非常复杂且非常慢的slowFunction(),我想在另一个线程中执行该函数,为此我使用了Qtconcurrent::run,下面是一个代码片段: void MyClass::startAnalysis() { //Run slowFunction in another thread QtConcurrent::run(this, &MyClass::slowFunction); } void MyClass:slowFunc
MyClass
,它包含一个非常复杂且非常慢的slowFunction()
,我想在另一个线程中执行该函数,为此我使用了Qtconcurrent::run,下面是一个代码片段:
void MyClass::startAnalysis() {
//Run slowFunction in another thread
QtConcurrent::run(this, &MyClass::slowFunction);
}
void MyClass:slowFunction() {
for(int i = 0; i < 100; i++) {
qDebug() << this << i;
}
}
void MyClass::startAnalysis(){
//在另一个线程中运行slowFunction
QtConcurrent::run(this,&MyClass::slowFunction);
}
void MyClass:slowFunction(){
对于(int i=0;i<100;i++){
qDebug()您需要使用QMutex保护对成员变量的访问
void MyClass
{
...
private:
QMutex mutex;
}
然后,每当您访问并发服务器使用的变量时,都会使用锁对其进行保护
{
QMutexLocker locker(&mutex);
// access variable
}
修改线程或QConcurrent中的成员变量并没有错,但您需要保护它。在本例中,如果我使用QFuture,则类实例将在需要时保持活动状态
class MyClass : QObject {
public:
void LongFunction() {
for( int count = 0; count < 5; count++ ) {
sleep( 1 );
std::cout << "Ping long!" << std::endl;
}
}
void run_c() {
QFuture<void> future = QtConcurrent::run(this, &MyClass::LongFunction);
}
};
int main(int argc, char *argv[])
{
MyClass c;
c.run_c();
}
类MyClass:QObject{
公众:
空长函数(){
对于(int count=0;count<5;count++){
睡眠(1);
std::cout很可能在线程开始运行之前,MyClass
的实例被破坏了。你能在调用startananalysis
的地方发布代码吗?我敢肯定,MyClass的正确实例不会被破坏。问题很可能不在你展示的代码中,这就是为什么我们无法提供帮助,除非你揭示了更多关于你的问题。我没有用你提供的代码示例重现“this”的崩溃。更多的代码会有所帮助,但我个人同意Yuki的观点,你的“this”可能被删除了,而你的慢函数仍然在使用它。事实上,这是我的“slowFunction()中的主要问题我对一个库进行了调用,说它不是线程安全的。因此,在该库中添加适当的互斥锁就成功了。