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_服务器
astd::atomic
或使用互斥锁等@Simple论坛上有人告诉我它能用^^^'@simpledesn不能用,你能用头文件和cpp文件写一个答案吗?@EvansBelloeil'论坛上有人告诉我它能用^^^''显然你接受这个答案有点太快了,没有阅读所有的c这个答案的作者告诉了你一些完全错误的事情。