当前位置: 技术问答>linux和unix
一个多线程的环形缓冲, 当写追上读时如何检测如何跨过去?
来源: 互联网 发布时间:2016-06-01
本文导语: 一个多线程的环形缓冲, 当写追上读时如何检测如何跨过去? 程序进行写时会先对缓冲加锁, 同样读的时候也会, 当写追上了读, 那么写前面永远都是读先锁好了缓冲, 这样写就永远都无法跨过去, 网上...
一个多线程的环形缓冲, 当写追上读时如何检测如何跨过去?
程序进行写时会先对缓冲加锁, 同样读的时候也会, 当写追上了读, 那么写前面永远都是读先锁好了缓冲, 这样写就永远都无法跨过去,
网上看到有一些人直接对不加锁 int标记进行访问 当标记为某状态表示缓冲在读或者写,那么发现正在读就会直接跨越过去, 就是所谓的无锁环形缓冲实现, 但又看到csdn某热帖讨论多线程访问int同样会有问题,但没给出合理的方案。 哪位大侠能够指点指点??
程序进行写时会先对缓冲加锁, 同样读的时候也会, 当写追上了读, 那么写前面永远都是读先锁好了缓冲, 这样写就永远都无法跨过去,
网上看到有一些人直接对不加锁 int标记进行访问 当标记为某状态表示缓冲在读或者写,那么发现正在读就会直接跨越过去, 就是所谓的无锁环形缓冲实现, 但又看到csdn某热帖讨论多线程访问int同样会有问题,但没给出合理的方案。 哪位大侠能够指点指点??
|
微软MSDN上的伪代码整理如下:
WriteProcess() //写者过程
{
//设置写者信号量为无信号,阻塞全部读过程
ResetEvent( WriteEvent );
//等待所有读者信号量(代表所有读过程均完毕)
WaitForMultipleObjects( ReadEvent );
//写入数据
Write Data;
//设置写者信号量为有信号(代表写过程完毕)
SetEvent( WriteEvent );
//设置所有读者信号量为有信号(代表它们可以读)
For(i)
SetEvent( ReadEvent[i] );
}
ReadProcess( nIndex ) //第 nIndex 个读者过程
{
//等待写者信号量(代表写过程完毕),
//同时等待此读者信号量(代表可以读)
WaitForMultipleObjects( WriteEvent and ReadEvent[nIndex] );
//设置读信号量为无信号,阻塞写过程
ResetEvent( ReadEvent[nIndex] );
//读出数据
Read Data;
//设置读者信号量为有信号(代表此读过程完毕)
SetEvent( ReadEvent[nIndex] );
}
WriteProcess() //写者过程
{
//设置写者信号量为无信号,阻塞全部读过程
ResetEvent( WriteEvent );
//等待所有读者信号量(代表所有读过程均完毕)
WaitForMultipleObjects( ReadEvent );
//写入数据
Write Data;
//设置写者信号量为有信号(代表写过程完毕)
SetEvent( WriteEvent );
//设置所有读者信号量为有信号(代表它们可以读)
For(i)
SetEvent( ReadEvent[i] );
}
ReadProcess( nIndex ) //第 nIndex 个读者过程
{
//等待写者信号量(代表写过程完毕),
//同时等待此读者信号量(代表可以读)
WaitForMultipleObjects( WriteEvent and ReadEvent[nIndex] );
//设置读信号量为无信号,阻塞写过程
ResetEvent( ReadEvent[nIndex] );
//读出数据
Read Data;
//设置读者信号量为有信号(代表此读过程完毕)
SetEvent( ReadEvent[nIndex] );
}