c++互斥保证避免竞争条件吗?
Does C++ Mutex guarantee avoiding race conditions?
我正在编写一个简单的例子来测试c++线程和互斥锁:
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
const int num_th = 50;
const int num_vals = 20;
const int num_it = 1000;
class MyVector {
public:
MyVector(int size): vals_(size, 0), idx_(0), mtx_() {}
void inc()
{
mtx_.lock();
for(int i=0; i<num_it; i++)
{
vals_[idx_]++;
idx_= (idx_+1) % num_vals;
}
mtx_.unlock();
}
int getVal(int idx) {return vals_[idx];}
private:
std::mutex mtx_;
int idx_;
std::vector<int> vals_;
};
int main(int argc, char *argv[])
{
MyVector m(num_vals);
std::thread t1[num_th];
for(int i=0; i<num_th; i++)
t1[i] = std::thread(&MyVector::inc, &m);
for(int i=0; i<num_th;i++)
t1[i].join();
for(int i=0; i<num_vals; i++)
std::cout<<" "<<m.getVal(i);
return 0;
}
执行后,所有的值应该是相同的,但这是输出:
2053 2063 2054 2038 2029 2038 2036 2043 2048 2049 2048 2055 2055 2050 2050 2051 2051 2055 2042 2066
c++互斥真的保证互斥吗,还是我错过了什么?
5gon12eder是对的。使用-pthread可以解决这个问题,并且输出是正确的:
2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500
我很惊讶你在使用线程时需要使用"-pthread"选项来编译器,并且没有编译或链接错误。
PS:编译器为gcc,操作系统为Linux (g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4)
相关文章:
- compare_exchange C++函数如何确定竞争条件?
- 在C++中写入相同值的竞争条件?
- QByteArray 通过队列连接按值发出并连接并附加到竞争条件?
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 如何修复条件变量等待/通知的竞争条件
- 在没有互斥锁的情况下重新计数时如何避免竞争条件?
- 替代 rand() 以避免竞争条件?
- CUDA 内核中的竞争条件
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- 类声明自己(*this)为private以避免竞争条件/放弃在gcc中对threadprivate的请求
- 使用 gtest EXPECT_CALL 时竞争条件段错误,而另一个期望是执行相同的方法
- boost::进程间消息队列创建时的竞争条件
- 如何在没有竞争条件的情况下将 QFutureWatcher 与 QtConcurrent::run() 一起使用
- 为什么 printf 可以屏蔽竞争条件,而系统日志不能?
- 为什么这个代码会产生竞争条件
- 为什么 CUDA 同步点不能阻止竞争条件?
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 如何使用 Boost Atomic 删除竞争条件
- boost::mutex 无法帮助避免C++程序中的竞争条件
- 类中的递归函数或竞争条件