【问题标题】:Mutex in Operating System [closed]操作系统中的互斥锁[关闭]
【发布时间】:2015-07-09 16:48:52
【问题描述】:

Mutex机制在c/c++中Console输入/输出的时候会出现吗?

我的意思是,控制台流是否会受到 Mutex 的保护并以通常的方式被线程锁定/解锁?

【问题讨论】:

  • 为什么不试试呢?在循环中启动两个除了控制台输出之外什么都不做的线程。如果您从两个线程中获得输出,则它受到某种锁的保护,可能是互斥锁。如果您处理崩溃,则没有锁定。
  • 这是您要问的吗? stackoverflow.com/q/6374264

标签: c++ c operating-system mutex


【解决方案1】:

是的,用std::mutex 包装输出将确保不同的线程不会同时访问流。 cout 与 stdio 同步时单独调用(默认行为)是安全的,但不能保证插入来自多个线程的字符的顺序。

考虑

#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********************

【讨论】:

  • 这意味着默认情况下控制台流不会由互斥锁处理或由同一线程锁定/解锁?
  • @NadeemBhati 如果对cout 的调用介于mutex.lock() 和mutex.unlock() 之间,那么它们将按照线程执行的顺序打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多