您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)atomic怎么在c++11項(xiàng)目中使用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
std::atomic_flag是一個(gè)原子的布爾類型,可支持兩種原子操作:
test_and_set, 如果atomic_flag對(duì)象被設(shè)置,則返回true; 如果atomic_flag對(duì)象未被設(shè)置,則設(shè)置之,返回false
clear. 清楚atomic_flag對(duì)象
std::atomic_flag可用于多線程之間的同步操作,類似于linux中的信號(hào)量。使用atomic_flag可實(shí)現(xiàn)mutex.
#include <iostream> #include <atomic> #include <vector> #include <thread> #include <sstream> std::atomic_flag lock = ATOMIC_FLAG_INIT; std::stringstream stream; void append_numer(int x) { while (lock.test_and_set()); stream << "thread#" << x << "\n"; lock.clear(); } int main() { std::vector<std::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 << stream.str(); return 0; }
std::atomic對(duì)int, char, bool等數(shù)據(jù)結(jié)構(gòu)進(jìn)行原子性封裝,在多線程環(huán)境中,對(duì)std::atomic對(duì)象的訪問不會(huì)造成競(jìng)爭(zhēng)-冒險(xiǎn)。利用std::atomic可實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的無鎖設(shè)計(jì)。
#include <iostream> #include <atomic> #include <vector> #include <thread> #include <sstream> std::atomic<bool> ready(false); std::atomic_flag winner = ATOMIC_FLAG_INIT; void count1m(int i) { while (!ready); for (int i=0; i<1000000; i++); if (!winner.test_and_set()) std::cout << "winner: " << i << std::endl; } int main() { std::vector<std::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; }
在上例中,執(zhí)行read=true之后,所有線程結(jié)束空等。winner被初始化為ATOMIC_FLAG_INIT,最先執(zhí)行winner.test_and_set并返回false的線程為winner。
#include <iostream> #include <atomic> #include <vector> #include <thread> #include <sstream> std::atomic<int> foo(0); void set_foo(int x) { foo = x; } void print_foo() { while (foo == 0) { std::this_thread::yield(); } std::cout << "x: " << foo << std::endl; } int main() { std::thread print_th(print_foo); std::thread set_th(set_foo, 10); print_th.join(); set_th.join(); return 0; }
在上例總,set_foo用于設(shè)置atomic<int>對(duì)象的值,print_foo用于打印atomic<int>對(duì)象的值。std::atomic對(duì)象的值的讀取和寫入可使用load和store實(shí)現(xiàn)。
#include <iostream> #include <cassert> #include <atomic> #include <vector> #include <unistd.h> #include <thread> #include <sstream> std::atomic<int> foo(0); std::atomic_flag lock = ATOMIC_FLAG_INIT; void add_foo() { while (1) { foo++; // foo = foo + 1; while (lock.test_and_set()); std::cout <<"add: " << foo << std::endl; lock.clear(); usleep(1000); } } void sub_foo() { while (1) { foo--; // foo = foo - 1; while (lock.test_and_set()); std::cout << "sub: " << foo << std::endl; lock.clear(); usleep(1000); } } int main() { std::thread th3 = std::thread(add_foo); std::thread th2 = std::thread(sub_foo); th2.join(); th3.join(); return 0; }
上述就是小編為大家分享的atomic怎么在c++11項(xiàng)目中使用了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。