【发布时间】:2018-02-15 07:46:56
【问题描述】:
我正在尝试学习没有锁的并发性。因此,我试图为共享变量计数器实现简单的比较和交换(cas)。我尝试创建 10 个线程,并希望使用 CAS 将每个线程的计数器值增加 1。因为 CAS 存储旧值并与当前值进行比较,并且仅在值未更改时才更新。寻找[这里] 我尝试实现 CAS,但无法正确执行。 c++中如何实现计数器共享变量的CAS?
#include <iostream>
#include <thread>
#include <unistd.h>
#include <atomic>
std::atomic<int> count = 0;
std::mutex n_mutux;
void increase_counter(int i)
{
int old_value = count.load() ;
while (!count.compare_exchange_weak(old_value, old_value +1))
{
}
}
int main() {
int thread_num =10;
std::thread t[thread_num];
for(int i=0;i<thread_num;i++)
{
t[i]=std::thread((increase_counter),i);
}
for(int i=0;i<thread_num;i++)
{
t[i].join();
}
std::cout<<count;
}
【问题讨论】:
-
你应该在你的 while 循环中更新 old_value
-
std::thread((increase_counter), i)中的括号是干什么用的? -
@FlorianM。我正在尝试使用 oldvalue +1 进行更新。计数初始化为原子共享变量是否正确??
-
@DeanSeo increase_counter 是每个线程使用 i 调用的函数,以防需要线程 ID。
-
代码似乎是正确的。什么是问题?您是否从
std::cout<<count;得到意外输出?还是什么?
标签: c++ multithreading concurrency