C++11多线程学习(1)atomic_flag

本文介绍了C++11中多线程的支持,特别是atomic_flag的使用,如何实现一个简单的自旋锁。通过线程和atomic_flag,实现了在确保所有线程创建好后开始计数,首个完成计数的线程输出其ID。文中提到了test_and_set()和clear()的操作,并解释了内存顺序参数的作用,以防编译器优化导致的问题。
摘要由CSDN通过智能技术生成

学了这么久我才刚刚知道C++11居然对多线程有如此丰富的支持,一方面感慨自己学的还是太少了,一方面真的很开心可以告别自己封装mutex,线程,currentthread这些东西了。最重要的一点,在windows上写的代码和在linux上也可以编译运行,这意味着可以使用宇宙第一IDE来调试多线程程序。我会用这个系列记录自己学习C++11多线程的过程。

C++11中引入了thread这个头文件,终于把线程当成对象来操作了,以前还要自己封装,还要自己定义每个线程的私有空间,现在C++11把一切都帮我们做了。

除了thread还有atomic,可以让我们让我们非常轻松的申请一个原子数,其中还包含一个atomic_flag,我们可以用它来制作一个自旋锁。

首先来看看atomic_flag,它内含一个标志位,它支持两个操作test_and_set()和clear(),在使用之前用宏ATOMIC_FLAG_INIT初始化,初始化意义是吧其中的标志位置位0,test_and_set检测其中的标志位,如果是0就置位1,返回0,如果是1就不变,返回1,这些操作都是原子性的,clear用于把标志位置位0。

下面的程序可以用来熟悉上述的几个操作。大致的意思是创建10个线程,在确保所有线程都创建好了之后,开始计数,第一个计数完毕的输出自己的id。其中的全局原子数ready起到了类似发令枪的作用,yield用于防止忙等待,如果此时ready还没有准备好,就把时间片交出去。

#include<iostream>
#include<atom
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::atomic_bool是C++14中的原子布尔类型。它提供了原子操作,以确保多线程环境下的安全性。它可以用于实现锁、同步和并发算法等。使用std::atomic_bool可以保证对布尔类型的读写操作在多线程环境中是原子的,即不会发生竞态条件。 在C++14中,std::atomic_bool比std::atomic_flag功能更全,可以使用非原子的bool来赋值和初始化。例如,你可以这样使用std::atomic_bool: std::atomic_bool b(true); b = false; 这样就可以对b进行原子的赋值操作。 需要注意的是,std::atomic_flag由于限制性甚至不能用作一个通用的布尔标识,所以最好还是使用std::atomic_bool。在C语言中,也可以使用自旋锁来实现多线程的同步。以下是一个使用自旋锁实现的例子: #include <thread> #include <vector> #include <iostream> #include <atomic> std::atomic_flag lock = ATOMIC_FLAG_INIT; void f(int n) { for (int cnt = 0; cnt < 5; cnt++) { while (lock.test_and_set(std::memory_order_acquire)) ; // 自旋 std::cout << "Thread " << n << " count:" << cnt << std::endl; lock.clear(std::memory_order_release); // 释放锁 } } int main(int argc, char* argv[]) { std::vector<std::thread> v; for (int n = 0; n < 4; n++) { v.emplace_back(f, n); //使用参数进行初始化 } for (auto& t : v) { t.join(); //等待线程结束 } system("pause"); return 0; } 这个例子中,使用std::atomic_flag作为锁,通过test_and_set()和clear()函数来获得锁和释放锁。 总结来说,std::atomic_bool是C++14中的原子布尔类型,可以用于多线程环境下的安全操作。在C语言中,可以使用自旋锁来实现多线程的同步。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值