C++ 当互斥锁不够时?

C++ 当互斥锁不够时?,c++,multithreading,C++,Multithreading,我知道多线程编程应该很难。但事情似乎有一种奇怪的破裂方式。例如,我有多个线程,既可以更改其颜色,也可以向控制台写入错误日志 有两个问题: 乱码文本 颜色变化干扰/不在正确的时间 当我在更改控制台颜色并写入控制台的部分中添加互斥锁时,它有助于处理自互斥锁以来没有看到的阻塞文本,但控制台颜色仍然错误 因此,似乎只有互斥是不够的!我现在想我需要一个队列,以及一个线程,它在队列上等待并在队列中有东西时将其清除。所以我的问题是,如何衡量互斥锁何时足够?一旦涉及到管道/文件/通信和另一个进程?一个互斥体(如

我知道多线程编程应该很难。但事情似乎有一种奇怪的破裂方式。例如,我有多个线程,既可以更改其颜色,也可以向控制台写入错误日志

有两个问题:

乱码文本 颜色变化干扰/不在正确的时间 当我在更改控制台颜色并写入控制台的部分中添加互斥锁时,它有助于处理自互斥锁以来没有看到的阻塞文本,但控制台颜色仍然错误


因此,似乎只有互斥是不够的!我现在想我需要一个队列,以及一个线程,它在队列上等待并在队列中有东西时将其清除。所以我的问题是,如何衡量互斥锁何时足够?一旦涉及到管道/文件/通信和另一个进程?

一个互斥体(如boost/pthread mutex)将保证在不同线程(而不是进程)之间以独占方式访问共享资源,为此您需要一个命名信号量

听起来你的共享资源就是访问终端。仅仅因为在更改颜色时锁定了它,并不意味着在您决定更改颜色时它将被锁定。在写入终端或更改颜色之前,两个线程都会锁定互斥锁。创建两个互斥体并不太必要,因为您仍然在保护终端上的单个共享资源


如果线程既要写入文本又要更改颜色,互斥锁必须支持递归锁定,例如。

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