C++ 理解多线程与全局变量

标签 c++ multithreading mutex

我有一个声明了一些全局变量的 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/

相关文章:

c++ - 在一个 QTableWidget 单元格中显示不同颜色的字符串

c++ - 将单个 C++ 程序分解为具有继承性的多文件程序

c# - ThreadPool.QueueUserWorkItem 的意外行为

c# - 如何使用C#使线程按顺序通过门

c - 如何检查 libpcap 中的数据包可用性

multithreading - 在 Rust 中创建两个对结构线程安全的可变引用

c++ - 为函数提供最大字符串长度

java - 在后台运行 JAVA 中的 BASH 命令

c - 互斥锁在解锁之前是否会阻止访问?

c++ - 错误 C3861 : popen, pclose:在 C++ 中找不到标识符