C++ 正确使用std::原子、预增量值作为函数参数
我有需要唯一id(某些协议的数据包id)的代码。所以我使用了C++ 正确使用std::原子、预增量值作为函数参数,c++,multithreading,c++11,atomic,C++,Multithreading,C++11,Atomic,我有需要唯一id(某些协议的数据包id)的代码。所以我使用了std::atomic。读完后,我感到困惑,因为它说增量是这样做的提取\添加(1)+1 我知道fetch\u add中的值是以原子方式递增的,但在原子操作之外,我得到了递增前的值+1。我猜不是原子的 我可以使用一些函数(++原子值)? 我编写了简单的代码来检查它是否有效。这很有效,但我不明白为什么 #include<iostream> #include <atomic> #include <thread&g
std::atomic
。读完后,我感到困惑,因为它说增量是这样做的<代码>提取\添加(1)+1
我知道fetch\u add
中的值是以原子方式递增的,但在原子操作之外,我得到了递增前的值+1。我猜不是原子的
我可以使用一些函数(++原子值)
?
我编写了简单的代码来检查它是否有效。这很有效,但我不明白为什么
#include<iostream>
#include <atomic>
#include <thread>
#include <vector>
#include <random>
#include <mutex>
#include <algorithm>
std::atomic<int> Index = 0;
//int Index = 0; // non atomic Index. It will generate duplicities
std::vector<int> Numbers;
std::mutex Mutex;
std::default_random_engine Generator;
std::uniform_int_distribution<int> Distribution(5, 10);
void func(int Value)
{
std::lock_guard<std::mutex> Guard(Mutex);
Numbers.push_back(Value);
}
void ThreadProc()
{
Sleep(Distribution(Generator));
func(++Index); // is this proper usage of std::atomic?
}
int main()
{
const int ThreadCount = 1000;
std::vector<std::thread> Threads;
for ( int i = 0; i < ThreadCount; i++ )
{
Threads.push_back(std::thread(ThreadProc));
}
for_each(Threads.begin(), Threads.end(), [](std::thread& t) { t.join(); });
std::sort(Numbers.begin(), Numbers.end());
auto End = std::unique(Numbers.begin(), Numbers.end());
if ( Numbers.end() == End )
{
std::cout << "No duplicites found." << std::endl;
}
else
{
std::cout << "Duplicites found ! - " << Numbers.end() - End << std::endl;
for_each(End, Numbers.end(), [](int n) { std::cout << n << ", "; });
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
标准:原子指数=0;
//int Index=0;//非原子索引。它会产生两面性
std::向量数;
std::互斥互斥;
std::默认随机引擎生成器;
标准:均匀分布(5,10);
void func(int值)
{
std::锁定保护(互斥);
数字。推回(值);
}
void ThreadProc()
{
睡眠(分配(发生器));
func(++Index);//这是std::atomic的正确用法吗?
}
int main()
{
const int ThreadCount=1000;
向量线程;
对于(int i=0;i std::cout+1
部分适用于临时的、本地的int
,而不是由原子的管理的共享状态。换句话说,您实际上是在执行int temp=atomic\u value.fetch\u add(1);some\u func(temp+1)
@IgorTandetnik好吧,我同意。但它没有解释为什么它能工作。或者它比标准int更好。你觉得问题出在哪里?为什么它不能工作?fetch\u add
是原子的。temp
不是在线程之间共享的,所以你对它做什么,以及如何做都无关紧要。@IgorTandetnik我现在明白了。我想那是愚蠢的原子值的ign也是原子的。谢谢。