相关疑难解决方法(0)

为什么通过std :: atomic使用volatile限定符?

从我从Herb Sutter其他人那里读到的内容,您会认为volatile并发编程是完全正交的概念,至少就C/C++而言.

但是,在GCC 实现中,所有std::atomic的成员函数都有volatile限定符.安东尼威廉姆斯的实施也是如此std::atomic.

那么什么是交易,我的atomic<>变量需要volatile与否?

c++ atomic volatile c++11

71
推荐指数
3
解决办法
7582
查看次数

有一个安全的方法让std :: thread作为类的成员吗?

我想使用一个管理线程(或几个线程)的类.使用组合,这看起来像:

class MyClass{
private:
    std::thread mythread;
    void _ThreadMain();
public:
    MyClass();
    // other fields
}
Run Code Online (Sandbox Code Playgroud)

因为a的默认构造函数std::thread是没有意义的,我需要在MyClass构造函数中显式调用它:

MyClass::MyClass() : mythread(&MyClass::_ThreadMain,this) {}
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,该_ThreadMain方法很可能 MyClass构造之前执行,从而导致任何类型的奇怪行为.这显然是不安全的.我怎样才能解决这个问题?

一个明显的解决方案是使用指针std::thread代替,并添加另一个成员函数:

void MyClass::Start(){
    // This time mythread is of type  std::thread*
    mythread = new std::thread(&MyClass::_ThreadMain,this); // One could use std::unique_pointer instead.
}
Run Code Online (Sandbox Code Playgroud)

这将启动该线程.在这种情况下,它将在构造类之后调用,这确实是安全的.

但是,我想知道是否有任何合理的解决方案可以让我不使用指针.感觉它应该是可能的某种方式(嘿,必须有一种方法来在构建一个类时启动一个线程!),但我无法想出任何不会引起麻烦的事情.

我考虑过使用一个条件变量,_ThreadMain等待构造函数完成它的工作,但是在构造类之前我不能使用它,对吧?(如果MyClass是派生类,这也没有用)

c++ multithreading initialization class c++11

14
推荐指数
2
解决办法
8405
查看次数

标签 统计

c++ ×2

c++11 ×2

atomic ×1

class ×1

initialization ×1

multithreading ×1

volatile ×1