c++ - 为了在 C++ 中线程安全,我应该使用互斥锁保护原始类型上的操作吗?

标签 c++ locking thread-safety mutex atomic

为相当简单的操作实现线程安全的最佳方法是什么?

考虑一对函数:

void setVal(int val)
{
    this->_val = val;
}

int getVal() {
     return this->_val;
}

因为即使是基本类型的赋值也不能保证是原子的,我是否应该按照以下方式修改程序中的每个 getter 和 setter 以确保线程安全?

void setVal(int val)
{
    this->_mutex.lock();
    this->_val = val;
    this->_mutex.unlock();
}

int getVal() {
     this->_mutex.lock();
     int result = this->_val;
     this->_mutex.unlock();
     return result;
}

最佳答案

你在使用 _val在多个线程中?如果没有,则不需要,您不需要同步访问它。

如果从多个线程使用它,那么是的,您需要使用互斥锁或使用原子类型(如 C++0x 中的 std::atomic<T>,尽管其他线程库具有非标准原子类型,如好吧)。

关于c++ - 为了在 C++ 中线程安全,我应该使用互斥锁保护原始类型上的操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3618656/

相关文章:

c++ - interprocess::named_upgradable_mutex - 如果进程被杀死则保持锁定

python - wxpython中的线程安全

java - 按下按钮时运行线程

python - 在 Python 中使用多处理模块时无法在进程之间互锁

sql - 避免在SQL Server 2008中使用MAX + 1整数进行并发问题…制作自己的IDENTITY值

.net - .Net Framework 中的哪个线程安全集合将 “Contains” 作为其 API 之一?

c++ - 尝试获取 C++ switch 语句来识别空格、制表符等

c++ - 静态数据成员是否可以在 C++ 中键入其容器类型?

c++ - 用最短的编码长度解决问题

c++ - 将元素存储在 unordered_set 中与将它们存储在 unordered_map 中