【问题标题】:When mutex lock isn't enough?什么时候互斥锁还不够?
【发布时间】:2011-09-08 20:25:25
【问题描述】:

我知道多线程编程应该很难。但似乎事情找到了一种奇怪的破坏方式。例如,我有多个线程同时更改控制台的颜色和写入控制台(它是一个错误日志)。

有两个问题:

  • 乱码
  • 颜色变化干扰/不在正确的时间

当我向更改控制台颜色并写入控制台的部分添加互斥锁时,它有助于处理混乱的文本(自互斥锁以来没有看到任何内容),但控制台颜色仍然错误。

所以看起来一个互斥锁是不够的!我现在想我需要一个队列,以及一个等待该队列并在其中有东西时将其刷新的线程。所以我的问题是,你如何判断互斥锁何时足够?一旦涉及另一个进程的管道/文件/通信?

【问题讨论】:

  • 你对问题的描述真的很难说什么。锁通常就足够了,因为它们隔离了进行原子修改的事务。
  • 读取为您有两个互斥锁或错误地组合颜色变化并写入一个锁定操作。
  • 听起来你的函数改变了全局状态(控制台颜色),然后假设全局状态即使在释放互斥锁后仍然有效。
  • 你能分离出改变颜色的相关代码并创建一个更简单的程序来显示错误吗?
  • 如果使用得当,互斥体就足够了。安德烈的建议很好。

标签: c++ multithreading


【解决方案1】:

互斥体(例如 boost/pthread 互斥体)将保证在不同线程(但不是进程,您需要一个命名信号量)之间对共享资源的独占访问。

听起来您的共享资源正在访问终端。仅仅因为您在更改颜色时锁定它,并不意味着当您决定更改颜色时它会被锁定。两个线程都会在写入终端或更改颜色之前锁定互斥锁。创建两个互斥锁并没有太大必要,因为您仍在保护单个共享资源(终端)。

如果一个线程既想写文本又想改变颜色,互斥锁必须支持递归锁定,例如recursive_mutex

【讨论】:

    猜你喜欢
    • 2012-09-15
    • 1970-01-01
    • 2011-08-17
    • 2019-01-30
    • 2017-12-10
    • 1970-01-01
    • 2010-11-18
    • 2011-05-01
    相关资源
    最近更新 更多