Альтернатива Windows InterlockedIncrement64 с использованием C++

Я использую InterlockedIncrement64 в своем приложении для атомарного приращения, чтобы убедиться, что он потокобезопасен. Мой код должен основываться только на библиотеке времени выполнения c, я решил использовать атомарный класс. Я написал следующие 2 метода.

#include "stdafx.h"
#include <iostream>
#include <atomic>
#include "time.h"
using namespace std;

void InterLockedIncrement64(int64_t* input)
{
    /*static*/ atomic<int64_t> ato(*input);
    //ato.store(*input);
    ato.fetch_add(1);
    *input = ato.load();
}
void InterlockedIncrement64_(int64_t* input)
{
    atomic<int64_t> *atomicData = reinterpret_cast<atomic<int64_t>*>(input);
    atomicData->fetch_add(1);
}
int _tmain(int argc, _TCHAR* argv[])
{
    int64_t count = 0;
    int64_t count_ = 0;
    while (true)
    {
        clock_t c = clock();
        for (int i = 0; i < 1000001; i++)
        {
            InterlockedIncrement64_(&count_);
        }
        uint32_t time1 = clock() - c;
        c = clock();
        for (int i = 0; i < 1000001; i++)
        {
            InterLockedIncrement64(&count);
        }
        uint32_t time2 = clock() - c;

        cout << "Time 1 = " << time1 << endl;
        cout << "Time 2 = " << time2 << endl;

        char in = cin.get();
        if(in == 'c')
        {
            break;
        }
    }
    system("pause");
    return 0;
}

Я думаю, что первый метод в порядке (мне нужно подтверждение для этого)! Второй метод рассчитал тот же результат, но не проверенный в многопоточности, но он быстрее, второй подозрительно для меня, мне нужен совет от тех, кто у кого есть опыт.

0 ответов

Другие вопросы по тегам