对内存缓冲区的高效多线程共享访问

时间:2014-12-05 22:09:29

标签: multithreading pthreads

这个问题可能很简单,但我仍然无法找到一种有效的方法。我有以下设置:

1)线程A不断地将数据从互联网下载到内存缓冲区。

2)同时,线程B想要读取已从此缓冲区下载的数据。

缓冲区不是圆形或任何东西。有一个写入光标和一个读取光标。一旦线程A向缓冲区写入内容,它就会更新写入光标以告诉线程B当前有多少数据可用于读取。

问题是线程B经常读取数千个字节,但一次只能读取一个字节。因此,我需要一种有效的方法来同步两个线程。我已经尝试过SetEvent()和WaitForSingleObject(),但这似乎很慢(或者我做错了),因为线程B从缓冲区读取1个字节的数据包,因此线程B必须为每个调用WaitForSingleObject()需要读取的字节。听起来很开销。

在没有任何互斥(临界区)保护的情况下,是否可以这样做?即线程B只能轮询写入光标,直到有足够的数据可用,然后复制它。但随后出现同步问题,即当线程A更新写入游标时,这个变化是否会立即反映在线程B中?我对多线程编程没有多少经验,而且很多文章听起来都非常复杂,所以如果有人能指出我正确的方向以高效的方式实现这一点,我会很高兴。

1 个答案:

答案 0 :(得分:0)

是的,您可以在一个线程中轮询其他线程中所做的更改,而无需使用互斥锁。这非常快,但由于线程B不断轮询以检查新数据,因此CPU开销很高。