// thread function for readers
void func_readers()
{
for (int i = 0; i < 1000000; ++i)
{
read_lock();
//do some work;
}
}
// thread function for writers
void func_writers()
{
write_lock();
// do some work;
}
假设有4个读者线程,并且编写器线程开始工作。它会停止,因为有4个读取线程。当第一次读取线程完成迭代时,它会启动另一个,并调用read_lock()。写线程仍然等待,因为有3个读取线程。由于没有写入线程,第一个读取线程开始另一个迭代,依此类推......这是否意味着所有4个线程很可能会完成1000000次的工作,并且只有在写入线程开始执行它之后才能工作? / p>
答案 0 :(得分:0)
我相信在这种情况下,如果读者和作者线程共享同一个锁,作者仍然有机会写一些东西。把它想象一下:
让我们说reader1目前有锁。 Reader2,reader3和reader4都在等待锁定的队列中。正是在这一点上,编写者还将自己置于等待锁定的队列中。一旦reader1完成,它就会释放锁,然后将自己放回队列中。但请注意,此时,它位于作者之后的队列中。
一旦reader2,reader3和reader4从队列中弹出并完成工作,作者将有机会获得锁定。
虽然这段代码不是很有效(它基本上会串行运行),但它会起作用。此外,既然您正在讨论这个主题,那么您应该使用多个锁,计数器等来研究读者/作者的不同实现。:)