最佳多线程全局变量管理

时间:2018-01-15 21:35:17

标签: c++ windows multithreading c++11 c++17

我已经查看了std::atomic(它不起作用)和std::mutex(管理起来太多)这样的事情,但没有任何工作:(我'使用std::thread创建我的帖子,但我可以使用CreateThread()

以下是场景:我有一个在一个线程中不断更新的变量。 (说它是一个int,反映了一些价值,如用户拥有的美元数)在其他线程中,我访问此变量,但不写入它(只是读取)。我能为此做些什么?

std::atomic在第一个帖子中没有足够快地存储信息,这会导致真正破坏的值(假设用户有10美元,如果我在std::atomic实际更新之前写了两次$ 10它,它将是一个模糊的价值,如2800万) - 没有"变量保存队列"任何形式。

std::mutex只需要过多关注并破坏代码可读性。

管理这些全局变量的最佳方法是什么?我喜欢像std::atomic一样直观的东西,因为它为我管理一切,但最好能满足我目前的困境。

2 个答案:

答案 0 :(得分:2)

如果您有全局互斥锁:

std::mutex my_global_variable_mutex;

您可以定义一个功能:

void im_doing_something_with_global_variable() {
    std::lock_guard<std::mutex> lock(my_global_variable_mutex);
    fun();
    // operations with global variable
    fun();
} // lock will be destroyed here; mutex is unlocked

和其他功能:

void im_doing_something_else_with_global_variable() {
    std::lock_guard<std::mutex> lock(my_global_variable_mutex);
    fun();
    // others operations with global variable
    fun();
} // lock will be destroyed here; mutex is unlocked

我认为这很优雅,也很容易;

+++++++++++++++

一位作家和许多读者的版本:

mutable std::shared_mutex my_global_variable_mutex;

void im_reading_global_variable() {
    std::shared_lock<std::shared_mutex> lock(my_global_variable_mutex);
    return my_global_variable;
} // lock will be destroyed here; mutex is unlocked

void im_doing_something_with_global_variable() {
    std::unique_lock<std::mutex> lock(my_global_variable_mutex);
    fun();
    // operations with global variable
    fun();
} // lock will be destroyed here; mutex is unlocked

答案 1 :(得分:0)

互斥锁几乎不需要任何注意,只需使用std :: lock_guard guard(myMutex);,您不必担心直接调用锁定和解锁。

将lock_guard专门用于自定义类型(例如Windows CRITICAL_SECTION)也很容易。