C++ 在主线程和线程之间共享一个变量

C++ 在主线程和线程之间共享一个变量,c++,multithreading,qt,c++11,network-programming,C++,Multithreading,Qt,C++11,Network Programming,我有一个类main窗口,它在线程中打开一个服务器函数,我需要在我的主线程和我的线程之间共享一个bool变量,我尝试使用volatile变量,但它不起作用,下面是代码: //Constructor MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //Some initialisation ...

我有一个类
main窗口
,它在
线程
中打开一个
服务器
函数,我需要在我的主线程和我的线程之间共享一个
bool变量
,我尝试使用
volatile变量
,但它不起作用,下面是代码:

//Constructor
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Some initialisation
...

    // Constructs the new thread and runs it. Does not block execution.
    bool_Server = true;//Variable supposed to be shared
    m_t1 = std::thread(lancerServeur, bool_Server);

}

MainWindow::~MainWindow()
{
    delete ui;
    bool_Server = false; //Variable supposed to be shared
    m_t1.join();
}


void MainWindow::lancerServeur(bool boolServer){
    serveur s;
    while(boolServer){
        s.receiveDataUDP();//Read data in non blocking mode
    }
}

.h文件中的易失性变量是否共享?

bool_服务器
更改为
std::atomic bool_服务器
,并将.cpp文件更改为:

//Constructor
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Some initialisation
...

    // Constructs the new thread and runs it. Does not block execution.
    bool_Server = true;//Variable supposed to be shared
    m_t1 = std::thread(lancerServeur, std::ref(bool_Server));

}

MainWindow::~MainWindow()
{
    delete ui;
    bool_Server = false; //Variable supposed to be shared
    m_t1.join();
}


void MainWindow::lancerServeur(std::atomic<bool>& boolServer){
    serveur s;
    while(boolServer){
        s.receiveDataUDP();//Read data in non blocking mode
    }
}
//构造函数
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
//一些初始化
...
//构造新线程并运行它。不阻止执行。
bool_Server=true;//应该共享的变量
m_t1=std::thread(LanserServeur,std::ref(bool_服务器));
}
MainWindow::~MainWindow()
{
删除用户界面;
bool_Server=false;//应该共享的变量
m_t1.join();
}
void主窗口::lancerServeur(标准::原子和布尔服务器){
serveur s;
while(boolServer){
s、 receiveDataUDP();//以非阻塞模式读取数据
}
}

您正在将
bool\u服务器的副本
传递到
main window::lancerServeur
,因此它观察到的变量没有以任何方式连接到原始的
bool\u服务器
。将其设置为
volatile
不会有帮助,而且
volatile
也不会使对对象线程的访问安全

您应该使用
原子
作为标志,并使其成为
主窗口
的数据成员。无需将其传递给
lancerServeur
。下面是一个简单的例子,它运行一个线程5秒,然后退出

#include <atomic>
#include <thread>
#include <chrono>
#include <iostream>

struct MainWindow
{
  std::atomic<bool> stop_{false};
  std::thread task_;

  void run()
  {
    while(!stop_) {
      std::cout << "Processing ...\n";
      std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    std::cout << "Stopping ...\n";
  }

  void launch_thread()
  {
    task_ = std::thread(&MainWindow::run, this);
  }

  ~MainWindow()
  {
    stop_ = true;
    task_.join();
  }
};

int main()
{
  {
    MainWindow w;
    w.launch_thread();
    std::this_thread::sleep_for(std::chrono::seconds(5));
  }
}
#包括
#包括
#包括
#包括
结构主窗口
{
std::原子停止{false};
线程任务;
无效运行()
{
而(!停止){

std::您是否正在按值传递变量。如何共享该变量?使用
std::thread(LanserServeur,std::ref(bool_服务器))
并制作
bool_服务器
a
std::atomic
或使用互斥锁等@Simple论坛上有人告诉我它能用^^^'@simpledesn不能用,你能用头文件和cpp文件写一个答案吗?@EvansBelloeil'论坛上有人告诉我它能用^^^''显然你接受这个答案有点太快了,没有阅读所有的c这个答案的作者告诉了你一些完全错误的事情。