【发布时间】:2011-10-30 08:17:18
【问题描述】:
我读了一篇关于多线程程序设计http://drdobbs.com/architecture-and-design/215900465的文章,它说“用异步消息替换共享数据是一个最佳实践。尽可能地让每个线程的数据保持隔离(非共享),并让线程代替通过传递数据副本的异步消息进行通信”。
让我感到困惑的是,我看不出使用共享数据和消息队列之间的区别。我现在在 windows 上做一个非 gui 项目,所以让我们使用 windows 的消息队列。并以传统的生产者-消费者问题为例。
使用共享数据,在生产者线程和消费者线程之间会有一个共享容器和一个保护容器的锁。生产者输出产品时,先等待锁,然后向容器写入内容,然后释放锁。
使用消息队列,生产者可以简单地 PostThreadMessage 没有阻塞。这就是异步消息的优势。但我认为两个线程之间必须存在一些锁来保护消息队列,否则数据肯定会损坏。 PostThreadMessage 调用只是隐藏细节。我不知道我的猜测是否正确,但如果是真的,优势似乎不再存在,因为这两种方法做同样的事情,唯一的区别是系统在使用消息队列时隐藏了细节。
ps。也许消息队列使用非阻塞容器,但我也可以以前一种方式使用并发容器。我想知道消息队列是如何实现的,这两种方式有什么性能差异吗?
更新: 如果消息队列操作仍然被其他地方阻塞,我仍然不明白异步消息的概念。如果我的猜测是错误的,请纠正我:当我们使用共享容器和锁时,我们将阻塞在我们自己的线程中。但是当使用消息队列时,我自己的线程立即返回,并将阻塞工作留给某个系统线程。
【问题讨论】:
标签: c++ windows multithreading message-queue