多线程程序的boost非阻塞读写例程 < P>我用Boost C++编写线程间的数据交换编码。p>

多线程程序的boost非阻塞读写例程 < P>我用Boost C++编写线程间的数据交换编码。p>,c++,multithreading,boost,pthreads,nonblocking,C++,Multithreading,Boost,Pthreads,Nonblocking,有些线程需要异步读取或写入某些数据结构 例如,我们有线程1和线程2 当线程1需要从线程2获取一些数据时,如果数据仍然不可用于线程1, 它不应该被阻止,可以做其他事情,然后再回去检查数据 线程2也是如此 boost非阻塞读写的API例程有哪些,哪些可以做到这一点 我在boost文档中找不到它 我在这里找到了适用于solaris的内容: 我需要能够支持以下功能的API例程: (1) 首先发布读写例程 (2) 做其他事情 (3) 然后返回检查数据是否可用 谢谢如果结构是标准容器,您只需跟踪容器大小即

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

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

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

线程2也是如此

boost非阻塞读写的API例程有哪些,哪些可以做到这一点

我在boost文档中找不到它

我在这里找到了适用于solaris的内容:

我需要能够支持以下功能的API例程:

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

谢谢

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

如果您从文件描述符中读取,请使其非阻塞。从它们读取将返回一个错误
EAGAIN
ewoodblock

编辑正如另一张海报所说,您始终可以使用。尝试锁定互斥锁,如果它失败,则继续执行其他工作

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

boost非阻塞读写的API例程有哪些,哪些可以做到这一点

谁说有?通常由您来创建更高级别的功能。线程用于创建线程和管理线程之间的同步通信


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

数据容器大小相同,但每次迭代时其内容都不同。@user1002288您可以修改容器,使其具有一个标志,指示其中是否有新内容?如何使数据生产者通知消费者知道新数据可用,以便尽快告知消费者?@user100228:这取决于你。您的消费者线程无法开始处理其他内容;它必须停止并定期检查是否有可用的东西。你确定你不只是想让你的用户阻塞互斥锁,而是把它的时间片交给其他线程来完成你所说的“其他工作”吗?这可能是一种比不断轮询互斥锁更有效的方法。我需要对大型数据结构的一个元素进行非阻塞读/写,这是一个stl::map。在某个时间点,每个线程需要读/写map的一个元素,例如map[i]。我需要只锁定元素映射[I]而不锁定其他元素的互斥体,因为其他线程可能需要同时读/写它们。映射的大小是恒定的,但其元素的内容在每次迭代时都会更新。@user1002288:您是否考虑过以不需要您尝试执行的方式构造代码?或者你可以用不同的方式来做?因为事实上,你要做的是非常特殊的情况。几乎可以肯定,有一种更有效的方法来完成这项工作。