为多线程程序提升非阻塞读写例程

时间:2011-11-23 00:31:57

标签: c++ multithreading boost pthreads nonblocking

我正在通过boost C ++编写线程之间的数据交换。

某些线程需要异步读取或写入某些数据结构。

例如,我们有线程1和线程2。

当线程1需要从线程2获取一些数据时,如果数据仍不可用于线程1, 它不应该被阻止,可以做其他事情,然后再回去检查数据。

线程2也是如此。

boost非阻塞读写的API例程有哪些呢?

我在增强文档中找不到它。

我在这里找到了solaris的东西:

http://www.shrubbery.net/solaris9ab/SUNWdev/MTP/p31.html

我需要支持的API例程:

(1)首先发布读写例程 (2)做其他事情 (3)然后返回检查数据是否可用

感谢

2 个答案:

答案 0 :(得分:0)

如果结构是标准容器,您只需跟踪容器大小即可。如果它比之前的检查更大,则会有新数据。

如果您从文件描述符中读取,请将它们设为非阻塞。从他们那里读取会返回EAGAINEWOULDBLOCK的错误。

修改正如另一张海报所说,您可以随时使用mutex。尝试锁定互斥锁,如果失败则继续执行其他工作。

编辑2 如果容器的大小是静态的,那么您需要在线程之间进行一些其他信令或通信。我想到了互斥锁/条件变量,或者向容器添加了一个标记,表明它已被修改。容器中的标志仅在容器的一个读取器有效时才有效,因为读取器应在完成时清除该标志。

答案 1 :(得分:0)

  

boost非阻塞读写的API例程有哪些呢?

谁说有什么?通常由您来创建更高级别的功能。 Boost.Thread用于创建线程并管理它们之间的同步通信。

您可以使用一对互斥锁轻松构建它。当生产者线程完成生成数据时,它会释放对互斥锁的锁定,这允许消费者线程开始消费。您可以使用其他互斥锁来阻止生产者在消费者完成消费之前将新数据生成到缓冲区中。