atomic头文件编译_c++11新特性之atomic

std::atomic_flag

std::atomic_flag是一个原子的布尔类型,可支持两种原子操作:

test_and_set, 如果atomic_flag对象被设置,则返回true; 如果atomic_flag对象未被设置,则设置之,返回false

clear. 清楚atomic_flag对象

std::atomic_flag可用于多线程之间的同步操作,类似于linux中的信号量。使用atomic_flag可实现mutex.

#include #include#include#include#includestd::atomic_flaglock =ATOMIC_FLAG_INIT;

std::stringstream stream;void append_numer(intx)

{while (lock.test_and_set());

stream<< "thread#" << x << "\n";lock.clear();

}intmain()

{

std::vector<:thread>ths;for (int i=0; i<10; i++)

ths.push_back(std::thread(append_numer, i));for (int i=0; i<10; i++)

ths[i].join();

std::cout<

}

2. std::atomic

std::atomic对int, char, bool等数据结构进行原子性封装,在多线程环境中,对std::atomic对象的访问不会造成竞争-冒险。利用std::atomic可实现数据结构的无锁设计。

#include #include#include#include#includestd::atomic ready(false);

std::atomic_flag winner=ATOMIC_FLAG_INIT;void count1m(inti)

{while (!ready);for (int i=0; i<1000000; i++);if (!winner.test_and_set())

std::cout<< "winner:" << i <<:endl>

}intmain()

{

std::vector<:thread>ths;for (int i=0; i<10; i++)

ths.push_back(std::thread(count1m, i));

ready= true;for (int i=0; i<10; i++)

ths[i].join();return 0;

}

在上例中,执行read=true之后,所有线程结束空等。winner被初始化为ATOMIC_FLAG_INIT,最先执行winner.test_and_set并返回false的线程为winner。

#include #include#include#include#includestd::atomic foo(0);void set_foo(intx)

{

foo=x;

}voidprint_foo()

{while (foo == 0)

{

std::this_thread::yield();

}

std::cout<< "x:" << foo <<:endl>

}intmain()

{

std::thread print_th(print_foo);

std::thread set_th(set_foo,10);

print_th.join();

set_th.join();return 0;

}

在上例总,set_foo用于设置atomic对象的值,print_foo用于打印atomic对象的值。std::atomic对象的值的读取和写入可使用load和store实现。

#include #include#include#include#include#include#includestd::atomic foo(0);

std::atomic_flaglock =ATOMIC_FLAG_INIT;voidadd_foo()

{while (1)

{

foo++;//foo = foo + 1;

while (lock.test_and_set());

std::cout<

usleep(1000);

}

}voidsub_foo()

{while (1)

{

foo--;//foo = foo - 1;

while (lock.test_and_set());

std::cout<< "sub:" << foo <<:endl>

usleep(1000);

}

}intmain()

{

std::thread th2=std::thread(add_foo);

std::thread th1=std::thread(sub_foo);

th1.join();

th2.join();return 0;

}

atomic支持++和--的原子操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值