我已经查看了std::atomic
(它不起作用)和std::mutex
(管理起来太多)这样的事情,但没有任何工作:(我'使用std::thread
创建我的帖子,但我可以使用CreateThread()
以下是场景:我有一个在一个线程中不断更新的变量。 (说它是一个int,反映了一些价值,如用户拥有的美元数)在其他线程中,我访问此变量,但不写入它(只是读取)。我能为此做些什么?
std::atomic
在第一个帖子中没有足够快地存储信息,这会导致真正破坏的值(假设用户有10美元,如果我在std::atomic
实际更新之前写了两次$ 10它,它将是一个模糊的价值,如2800万) - 没有"变量保存队列"任何形式。
std::mutex
只需要过多关注并破坏代码可读性。
管理这些全局变量的最佳方法是什么?我喜欢像std::atomic
一样直观的东西,因为它为我管理一切,但最好能满足我目前的困境。
答案 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)也很容易。