我有一个声明了一些全局变量的 C++ 程序。之后它 split 成几个线程来完成几个任务。 这些线程读取和写入其中一些全局变量。
如果两个线程正在读取同一个变量,是否会出现应用程序崩溃?或者仅当一个线程写入另一个线程当前正在读取的变量时才会出现应用程序崩溃?
那么如果我的第二个问题的答案是肯定的,那么下面的代码示例能解决这个问题吗?
#include <string>
#include <thread>
#include <mutex>
using namespace std;
mutex m;
string var = "foo";
// function to provide read and write access
// "protected" with mutex
string test(string value = "")
{
m.lock();
if (value == "")
{
m.unlock();
return var;
}
else
{
var = value;
m.unlock();
return "";
}
}
void thread1()
{
// use global variable local
string localVar = test();
}
void thread2()
{
// overwrite global variable
test("bar");
}
void thread3()
{
// use global variable local
string localVar = test();
}
int main()
{
thread t1(thread1);
thread t2(thread2);
thread t3(thread3);
t1.join();
t2.join();
t3.join();
return 0;
}
此外:是这部分
// ...
if (value == "")
{
m.unlock();
return var;
}
// ...
还有线程保存?
我的最后一个问题:我的程序目前只使用一个互斥体来防止两个线程(同一个函数!)同时运行。我没有为我的全局变量使用互斥体。难道这种“情况”会导致应用程序崩溃(模块:“ntdll.dll”),异常代码为 0xc0000005?
提前致谢!
最佳答案
多次读取始终是线程安全的。一旦一个线程正在写入非原子变量 var
而其他线程正在从 var
中读取,您就会面临竞争条件的危险。所以你几乎就在那里,但是使用互斥保护(它们是 RAII,因此异常安全和更干净的 C++),比如:
#include <mutex>
#include <string>
// ...
std::mutex m;
std::string var = "foo";
// ...
std::string test(const std::string& value = "")
{
std::lock_guard<std::mutex> lock(m);
if (value == "")
{
return var;
}
else
{
var = value;
return "";
}
}
关于C++ 理解多线程与全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32672784/