考大家一个多线程开发中同步的问题

peimoxu 2009-11-02 03:47:16
下面的类中有几个接口,每个接口都可能有不同数目的线程在不确定的时候调用,看看大家能否实现同步


class Queue
{
public:
struct Item
{
virtual void Release() = 0;
virtual ~Item(){}
};

// 启用
bool Start(int maxItem = 10);

// 停用,并换醒所有GetItem正在等待的线程, deleteData为true时清除所有数据
bool Stop(bool deleteData = true);

// 添加,超过最大值时则等待,等待时被Stop换醒或timeout时则返回false
// timeout为-1时则无限等待
bool AddItem(Item* item, int timeout = -1);

// 获取,为空时则等待,等待时被Stop换醒或timeout时则返回NULL
Item* GetItem(int timeout = -1);

private:
std::vector<Item*> _items;

};
...全文
302 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
peimoxu 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ydbcsdn 的回复:]
不适合在接口内部做同步.
只能在接口外部对该对象的所有操作同步;
[/Quote]
我还不是太清楚在内和在外的本质区别,我在内部同步只是为了使用者方便
JonathanS666 2009-11-10
  • 打赏
  • 举报
回复
挺热闹的啊
robertcarlos 2009-11-10
  • 打赏
  • 举报
回复
楼上是周JJ?
unicode 2009-11-10
  • 打赏
  • 举报
回复
实现Stop的时候要分步,先stop掉所有的thread
peimoxu 2009-11-07
  • 打赏
  • 举报
回复
呵呵,本人早已实现了,最后我会帖代码的
wangk 2009-11-06
  • 打赏
  • 举报
回复
不明真相的群众路过围观....
tanwei1002 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ylywyn136 的回复:]
引用 11 楼 tanwei1002 的回复:
不懂就不懂呗 还名曰“考大家。。。。”
无语

呵呵,知道人家不懂,还故意拆穿
无语
[/Quote]

是故意拆穿的
不懂可以虚心问啊,为什么要装呢???
难道楼主的“自尊心”这么强?????????
ylywyn136 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tanwei1002 的回复:]
不懂就不懂呗 还名曰“考大家。。。。”
无语
[/Quote]
呵呵,知道人家不懂,还故意拆穿
无语
tanwei1002 2009-11-06
  • 打赏
  • 举报
回复
不懂就不懂呗 还名曰“考大家。。。。”
无语
Yao-debo 2009-11-05
  • 打赏
  • 举报
回复
不适合在接口内部做同步.
只能在接口外部对该对象的所有操作同步;
奉海 2009-11-05
  • 打赏
  • 举报
回复
timeout 进入等待状态时将临界区unlock,timeout 解除等待状态时又lock.
肯定是有办法同步的,如果想不出来,就是思路出了问题。
peimoxu 2009-11-05
  • 打赏
  • 举报
回复
这里面有个 timeout 使实现变得很复杂
_JeffreyWu 2009-11-05
  • 打赏
  • 举报
回复
没有真正的同步啊,多加几个CPU,一个CPU处理一个线程
peimoxu 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yfh1985sdq 的回复:]
timeout 进入等待状态时将临界区unlock,timeout 解除等待状态时又lock.
肯定是有办法同步的,如果想不出来,就是思路出了问题。
[/Quote]

>>timeout 进入等待状态时将临界区unlock,
这个用pthread_cond_timedwait就很容易了,windows上会略麻烦点

wolffan3150 2009-11-04
  • 打赏
  • 举报
回复
会死锁
哈利路亚1874 2009-11-04
  • 打赏
  • 举报
回复
对这些函数可以都加锁,或则都放入临界区!那样,随便你的多少线程来访问都不会成问题!
  • 打赏
  • 举报
回复
std::vector<Item*> _items;
Item在这里是不是一个结构,在该结构下增加一个互斥量,然后保证对每一个_items的互斥访问,而不应该是针对_items进行互斥访问。
wangyang327329 2009-11-03
  • 打赏
  • 举报
回复
添加一个互斥量或者临界区成员变量,在构造函数里初始化它,然后只要在每个接口实现里面利用添加的互斥量或者临界区成员来保护对成员std::vector<Item*> _items的互斥访问即可
peimoxu 2009-11-02
  • 打赏
  • 举报
回复
或者简单一点,start和stop只有同一个线程会调用

15,471

社区成员

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

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