我正在尝试进行缓冲区完全模拟。当我的缓冲区变满时,我需要将其复制以进行进一步处理,复制是互斥操作,但进一步处理不是。 我的动作流程是这样的,每当我要写一些东西时,如果条件为真我检查缓冲区满状态我复制当前缓冲区&处理它&然后写下新消息。
我有多个写作线程&消息应该只按顺序写入。 我的功能简述如下
bwrite(data)
{
lock(m1);
//invoke copy thread
lock(m1);
// Do write message
}
copy(data)
{
//copy the data
unlock(m1);
//Do further processing
}
问题在于,一旦复制完成,消息就会以任何顺序写入,例如thread01
,& thread02
有&如果thread01
复制第一个,我无法控制thread02
在thread01
写完最后一条消息之前可能开始复制的事实,因此可能会丢失一条消息。
这是一个很长的问题,基本上我需要一种方法将传入的线程放入队列中,以便我可以保证下一个执行序列。
答案 0 :(得分:2)
为什么不让线程写入共享队列?然后你可以让另一个线程一次一个地从队列中取出元素并写入它们 - 这可以保证它们按照排队的顺序写入。现在您只需要同步对队列的访问以使其成为线程安全的。
答案 1 :(得分:0)
答案 2 :(得分:0)
实际上我认为最好的解决方案是使用BlockingQueue。我敢肯定,如果你谷歌它你可以发现有人发布了样本c ++代码,但这里有一个它在java http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html
中的用法示例