操作系统中的互斥锁
Mutex in Operating System
在 c/c++ 中的控制台 input/output 时,互斥机制是否出现?
我的意思是,Console Stream 会被 Mutex 保护并以通常的方式被线程获取 locked/unlocked 吗?
是的,用 std::mutex
包装输出将确保不同的线程不会同时访问流。与 stdio(默认行为)同步时对 cout
的单独调用是安全的,尽管不保证插入多个线程的字符的顺序。
考虑
#include <iostream>
#include <mutex>
#include <thread>
std::mutex mx;
void print(char ch, int count)
{
std::lock_guard<std::mutex> lock(mx);
for (int i = 0; i < count; ++i)
{
std::cout << ch;
}
std::cout << std::endl;
}
int main() {
std::thread t1(print, 'x', 10);
std::thread t2(print, '*',20);
t1.join();
t2.join();
return 0;
}
有了互斥量,输出是(live example):
xxxxxxxxxx
********************
如果没有互斥锁,一种可能的输出是(live example):
xxxxxxxxxx********************
在 c/c++ 中的控制台 input/output 时,互斥机制是否出现?
我的意思是,Console Stream 会被 Mutex 保护并以通常的方式被线程获取 locked/unlocked 吗?
是的,用 std::mutex
包装输出将确保不同的线程不会同时访问流。与 stdio(默认行为)同步时对 cout
的单独调用是安全的,尽管不保证插入多个线程的字符的顺序。
考虑
#include <iostream>
#include <mutex>
#include <thread>
std::mutex mx;
void print(char ch, int count)
{
std::lock_guard<std::mutex> lock(mx);
for (int i = 0; i < count; ++i)
{
std::cout << ch;
}
std::cout << std::endl;
}
int main() {
std::thread t1(print, 'x', 10);
std::thread t2(print, '*',20);
t1.join();
t2.join();
return 0;
}
有了互斥量,输出是(live example):
xxxxxxxxxx
********************
如果没有互斥锁,一种可能的输出是(live example):
xxxxxxxxxx********************