Cplusplus.com給出的關(guān)于mutex如下:
Amutexis a lockable object that is designed to signal when critical sections of code need exclusive access,preventing other threads with the same protection from executing concurrentlyand access the same memory locations.
多個(gè)線(xiàn)程訪問(wèn)同一資源時(shí),為了保證數(shù)據(jù)的一致性,最簡(jiǎn)單的方式就是使用 mutex(互斥鎖)。
例如下面一段程序:
#include "stdafx.h"
#include <iostream>??????// std::cout
#include <thread>???????? // std::thread
#include <mutex>????????? // std::mutex
#include <atomic>
void print_block_no_mutex(int n, char c) {
??? for (int i = 0; i < n; ++i) { std::cout << c; }
??? std::cout << '\n';
}
int main()
{
??? /***不適用保護(hù)的情況下,出現(xiàn)了undefined的行為***/
??? std::thread th3(print_block_no_mutex, 50, '*');
??? std::thread th4(print_block_no_mutex, 50, '$');
??? th3.join();
??? th4.join();
}
程序邏輯是:創(chuàng)建兩個(gè)線(xiàn)程桂敛,兩個(gè)線(xiàn)程調(diào)用同一個(gè)函數(shù),分別輸出“*”和“$”。
我們希望的是th3先輸出50個(gè)‘*’,th4后輸出50個(gè)‘$’。但實(shí)際結(jié)果如下:
兩個(gè)線(xiàn)程交織在一起出現(xiàn)了沖突的現(xiàn)象。
如何解決這種undefined的行為?加入mutex。
void print_block(int n, char c) {
signaled by locking mtx):
??? mtx.lock();
??? for (int i = 0; i < n; ++i) { std::cout << c; }
??? std::cout << '\n';
??? mtx.unlock();
}
之后就能得到我們想要的結(jié)果:
在多線(xiàn)程環(huán)境中瓷胧,出現(xiàn)了數(shù)據(jù)的共同訪問(wèn)矛绘,加上mutex防止undefined行為是一個(gè)必要的手段囚玫。