Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正确使用std::原子、预增量值作为函数参数_C++_Multithreading_C++11_Atomic - Fatal编程技术网

C++ 正确使用std::原子、预增量值作为函数参数

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

我有需要唯一id(某些协议的数据包id)的代码。所以我使用了
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;istd::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也是原子的。谢谢。