Cplusplus.com给出的关于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.
多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 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()
{
/***不适用保护的情况下,出现了undefined的行为***/
std::thread th3(print_block_no_mutex, 50, '*');
std::thread th4(print_block_no_mutex, 50, '$');
th3.join();
th4.join();
}
程序逻辑是:创建两个线程,两个线程调用同一个函数,分别输出“*”和“$”。
我们希望的是th3先输出50个‘*’,th4后输出50个‘$’。但实际结果如下:
两个线程交织在一起出现了冲突的现象。
如何解决这种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();
}
之后就能得到我们想要的结果:
在多线程环境中,出现了数据的共同访问,加上mutex防止undefined行为是一个必要的手段。