多个生产者,多个消费者同步问题

勇往直前之人 2012-05-09 12:31:38
各位大侠,目前我正在处理这样一个项目。

软件内部不断在接收数据,接收的数据目前用来保存、转发以及其他几个方面处理。
目前,将前者作为写线程,后者作为读线程。

由于写线程与读线程之间不能同时进行,写线程与写线程之间不能同时进行,读线程与读线程之间则可以同步进行。
如果采用一个类似于CriticalSection或者Mutex,每次仅仅允许一个线程对共享数据操作,则降低效率。

我觉得应该采用信号量Semaphore,而且要配合其他线程同步方法使用。

具体如何使用,请各位兄台指点迷津。
...全文
1435 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
勇往直前之人 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

引用 4 楼 的回复:
其实不用信号量,只是用信号量的方法比较简单。

伪码:

struct fifo_queue
{
semphore sem;
mutex lock;
list msgs;
};

// 生产者
void post(fifo_queue queue, msg m )
{
queue.lock.wait();
que……
[/Quote]
多谢,看来是我问题问错了。
这里,应该是提问读者、写者问题(一人写,多人读),而不是生产者、消费者问题。
不过,仍然要谢谢你!
勇往直前之人 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
其实不用信号量,只是用信号量的方法比较简单。

伪码:

struct fifo_queue
{
semphore sem;
mutex lock;
list msgs;
};

// 生产者
void post(fifo_queue queue, msg m )
{
queue.lock.wait();
queue.msgs.push( m )……
[/Quote]

正解!
你采用了伪代码,思路和我想象的一样——信号量+mutex。
你能实际说明一下吗?你的sem、lock、msgs的意义到底是什么?
「已注销」 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
其实不用信号量,只是用信号量的方法比较简单。

伪码:

struct fifo_queue
{
semphore sem;
mutex lock;
list msgs;
};

// 生产者
void post(fifo_queue queue, msg m )
{
queue.lock.wait();
queue.msgs.push(……
[/Quote]

sem表示事件个数,每次post产生一个事件。lock是为了保护msgs,msgs就是一个链表。

如果想让此模式更有弹性,就还要加一个sem。

还有另外一个方法,比这个好。


勇往直前之人 2012-05-09
  • 打赏
  • 举报
回复
hdg3707,有道理。
一个生产者、一个消费者仅仅采用一个互斥就行。
多个生产者、多个消费者既要安全、又要高效,恐怕要采用信号量,与数据块的个数有关。
hdg3707 2012-05-09
  • 打赏
  • 举报
回复
生产者和消费者的例子在"操作系统"这本书里有代码,虽然是一个生产者和一个消费者,但实质上是一样的.我记得书上的例子用的是互斥量来同步的.
你可以从书上找例子看看或从网上下代码看看他们是如何实现的.
我觉得你的问题应该设一个写互斥信号和一个读互斥信号,也就是:
1.写前先判断写互斥信号,如果可以先锁定写信号并判断读互斥信号,如果可以就锁定读信号,进行写.写操作完成后先释放读信号,然后释放写信号.
2.读前先判断读信号,如果可以先锁定读信号并判断写信号,如果可以就锁定写信号,进行读,读完后先释放写信号,再释放读信号
3.循环1,2过程就行了
「已注销」 2012-05-09
  • 打赏
  • 举报
回复
其实不用信号量,只是用信号量的方法比较简单。

伪码:

struct fifo_queue
{
semphore sem;
mutex lock;
list msgs;
};

// 生产者
void post(fifo_queue queue, msg m )
{
queue.lock.wait();
queue.msgs.push( m );
queue.lock.release();
queue.sem.release();
}

// 消费者
msg wait( fifo_queue queue )
{
msg m;
queue.sem.wait();
queue.lock.wait();
m = queue.msgs.pop();
queue.lock.release();

return m;
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧