我是靠谱客的博主 现实鸵鸟,最近开发中收集的这篇文章主要介绍std::atomic原子操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、原子操作介绍

在多线程编程中,经常使用互斥锁锁住一段代码块,实现线程同步。原子操作可以看成是对变量的互斥锁。比如程序中一个线程读取一个变量,另一个线程修改该变量的值,那么采用原子操作可以不用添加互斥锁即可实现线程同步。

2、原子操作实例

采用原子操作,定义了一个全局变量iCount。

#include <thread>
#include <atomic>
#include <iostream>
#include <vector>

std::atomic<int> iCount(0);

void threadFunc1()
{
    for (size_t i = 0; i < 100; i++)
    {
        std::cout << "iCount = " << iCount++ << std::endl;
    }

    return;
}

void threadFunc2()
{
    for (size_t i = 0; i < 100; i++)
    {
        std::cout << "iCount = " << iCount-- << std::endl;
    }

    return;
}

int main(int argc, char **argv)
{
    std::vector<std::thread> vecThread;
    for (size_t i = 0; i < 100; i++)
    {
        vecThread.push_back(std::thread(threadFunc1));
    }

    for (size_t i = 0; i < 100; i++)
    {
        vecThread.push_back(std::thread(threadFunc2));
    }

    for (auto &th : vecThread)
    {
        th.join();
    }

    std::cout << "Finally iCount = " << iCount.load() << std::endl;
    return 0;
}

输出结果是0.

如果不采用原子操作:

#include <thread>
#include <atomic>
#include <iostream>
#include <vector>

int iCount = 0;

void threadFunc1()
{
    for (size_t i = 0; i < 100; i++)
    {
        std::cout << "iCount = " << iCount++ << std::endl;
    }

    return;
}

void threadFunc2()
{
    for (size_t i = 0; i < 100; i++)
    {
        std::cout << "iCount = " << iCount-- << std::endl;
    }

    return;
}

int main(int argc, char **argv)
{
    std::vector<std::thread> vecThread;
    for (size_t i = 0; i < 100; i++)
    {
        vecThread.push_back(std::thread(threadFunc1));
    }

    for (size_t i = 0; i < 100; i++)
    {
        vecThread.push_back(std::thread(threadFunc2));
    }

    for (auto &th : vecThread)
    {
        th.join();
    }

    std::cout << "Finally iCount = " << iCount << std::endl;
    return 0;
}

 

输出结果是-5, 而且每次运行,结果都不一样。

 3、注意事项

原子操作的初始化不能写成如下形式

std::atomic<int> iCount = 0;

会出现编译错误 error: use of deleted function

如果使用cmake编译,需要添加Threads库,本文采用的CMakeLists.txt文件如下

cmake_minimum_required(VERSION 2.8.0)

project(atomic_test)

find_package(Threads REQUIRED)

add_executable(test_with_atomic test_with_atomic.cpp)
target_link_libraries(test_with_atomic Threads::Threads)

add_executable(test_without_atomic test_without_atomic.cpp)
target_link_libraries(test_without_atomic Threads::Threads)

4、参考文献

1、c++11 std::atomic - 简书

2、CMake中使用pthread实践 - 知乎

最后

以上就是现实鸵鸟为你收集整理的std::atomic原子操作的全部内容,希望文章能够帮你解决std::atomic原子操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部