小编Jas*_*son的帖子

消息队列在线程通信中对共享数据的优势是什么?

我读了一篇关于多线程程序设计http://drdobbs.com/architecture-and-design/215900465的文章,它说这是"用异步消息替换共享数据的最佳实践.尽可能地保留每个线程的数据"隔离(非共享),让线程通过传递数据副本的异步消息进行通信".

令我困惑的是,我没有看到使用共享数据和消息队列之间的区别.我现在正在开发一个关于Windows的非gui项目,所以让我们使用windows的消息队列.并以传统的生产者 - 消费者问题为例.

使用共享数据,将有一个共享容器和一个锁定生产者线程和消费者线程之间容器的锁.当生产者输出产品时,它首先等待锁定然后向容器写入内容然后释放锁定.

使用消息队列,生产者可以简单地PostThreadMessage而不用阻塞.这是异步消息的优势.但我认为必须存在一些锁定两个线程之间的消息队列,否则数据肯定会被破坏.PostThreadMessage调用只是隐藏细节.我不知道我的猜测是否正确但是如果它是真的,优势似乎不再存在,因为两种方法都做同样的事情,唯一的区别是系统在使用消息队列时隐藏细节.

PS.也许消息队列使用非阻塞包含器,但我也可以使用前一种方式的并发容器.我想知道消息队列是如何实现的,这两种方式之间是否有任何性能差异?

更新:如果消息队列操作仍然在其他地方被阻止,我仍然没有得到异步消息的概念.如果我猜错了,请纠正我:当我们使用共享容器和锁时,我们将在我们自己的线程中阻塞.但是当使用消息队列时,我自己的线程立即返回,并将阻塞工作留给某个系统线程.

c++ windows multithreading message-queue

6
推荐指数
2
解决办法
9070
查看次数

如何使用 postThreadMessage 传递结构

我想使用 windows 的消息队列工具将结构发送到另一个线程。但是我发现postthreadmessage函数只提供了两个整型参数,lparam和wparam给我传递参数,所以我决定把struct的地址放在lparam里面。这是 Windows 用来传递结构的正确方式吗?

我打算使用 boost::shared_ptr 在接收者线程和发送者线程中保存 struct 的地址。我怀疑当两个 shared_ptrs 超出范围时,结构会被释放两次吗?我想不出一种方法来确保在堆上分配的结构将被 100% 释放,有什么想法吗?

windows boost message-queue shared-ptr

5
推荐指数
1
解决办法
2977
查看次数

为什么十进制浮点数应该用于财务计算,同时它有舍入误差

我目前正在使用c ++从事与股票市场相关的项目,涉及很多浮动类型,如价格和指数.

我读了很多说你应该在货币相关算术中使用十进制浮点数. 为什么不使用Double或Float来表示货币? .NET中的decimal,float和double之间的区别?

根据我的理解,浮点数和十进制浮点数之间的区别在于指数部分被解释的基数,浮点数使用2作为基数,十进制浮点数使用10.当使用十进制浮点数时,你仍然有舍入错误,你仍然无法表达1/3 (纠正我,如果我错了),我想很有可能将某人的账户余额乘以30%然后发生轮回错误,经过几次计算后,舍入误差可能会传播得更严重.除了更大的数字范围,为什么我应该在金融算术中使用十进制浮点数?

c++ floating-point bigdecimal

3
推荐指数
1
解决办法
1166
查看次数