求高手关于Thread Manager的设计,该如何解决
求高手关于Thread Manager的设计
最近手上一个项目非常棘手,需要用到多线程,多线程中的数据保护成为一个大难题,
因此想在这与大家讨论一下,如何设计一个Thread Manager去控制一个线程,并保护线程所要提供的数据
举个例子
我们有一个主线程,Main Thread, 其中正在做数据的采集,
其中有一个对象DataCollection, 里面有Vector, Int,和 MyObject 数据变量 等等
另外有一个线程,从并口接受数据,并进行分析,从DataCollection里面取数据,比如存取Vector 的值,MyObject的值,
这样操作可能会带来潜在危险。
按常理,我们可以通过在DataCollection里加锁,Mutex来解决,可是,假设对象DataCollection 是线程不安全,并不可以做大的修改。
如何设计一个Thread Manager 或者 是一个接口函数,或者是一个Wrapper,去管理这个线程
让其做到:
1. 控制线程的运行,停止等等
2. 防止线程安全
大家有没有什么好办法和主意?有UML图之类的设计,高分求!
------解决方案--------------------
标记,正在写线程池实现。
------解决方案--------------------
思路因该是这样的:如果DataCollection内部不能加锁, 那就在调用它的地方加锁
最近手上一个项目非常棘手,需要用到多线程,多线程中的数据保护成为一个大难题,
因此想在这与大家讨论一下,如何设计一个Thread Manager去控制一个线程,并保护线程所要提供的数据
举个例子
我们有一个主线程,Main Thread, 其中正在做数据的采集,
其中有一个对象DataCollection, 里面有Vector, Int,和 MyObject 数据变量 等等
另外有一个线程,从并口接受数据,并进行分析,从DataCollection里面取数据,比如存取Vector 的值,MyObject的值,
这样操作可能会带来潜在危险。
按常理,我们可以通过在DataCollection里加锁,Mutex来解决,可是,假设对象DataCollection 是线程不安全,并不可以做大的修改。
如何设计一个Thread Manager 或者 是一个接口函数,或者是一个Wrapper,去管理这个线程
让其做到:
1. 控制线程的运行,停止等等
2. 防止线程安全
大家有没有什么好办法和主意?有UML图之类的设计,高分求!
------解决方案--------------------
标记,正在写线程池实现。
------解决方案--------------------
思路因该是这样的:如果DataCollection内部不能加锁, 那就在调用它的地方加锁
- C/C++ code
lock(); DataCollection.read(); unLock(); .... lock(); DataCollection.write(); unLock();
------解决方案--------------------
可不可以写个适配器来适配DataCollection的接口呢!!在适配器里加锁
------解决方案--------------------
共享循环队列+Mutex互斥+条件变量等待。
或者做事件型异步设计,利用管道+I/O复用+循环队列+Mutex。
或者做成I/O IPC问题,一端写管道,一端读管道,也是很安全的。
看你的线程分工与数量,自己选择合适的方法。
------解决方案--------------------
可以自己再封装一层(和4楼意思差不多)
- C/C++ code
//示意代码 class DataCollectionForThreadSafe { public: write() { lock(); dataCollection->write(); unlock(); } read() { lock(); dataCollection->read(); unlock(); } private: DataCollection* dataCollection; }
------解决方案--------------------
外面调用的人只用DataCollectionForThreadSafe, 不用DataCollection。
或者说用户根本不需要知道DataCollection的存在
把DataCollection中的接口都在DataCollectionForThreadSafe中实现
比如:
- C/C++ code
class DataCollection { public: //会读取或者修改数据的接口 TypeReturn1 fun1(Type1 Para1, Type2 para2 ){....} //不会读取或者修改数据的接口 TypeReturn2 fun2(Type3 Para3, Type4 para4 ){....} 。。。。。。 } ...... class DataCollectionForThreadSafe { public: //会读取或者修改数据的接口 TypeReturn1 fun1(Type1 Para1, Type2 para2 ) { lock(); dataCollection->fun1(Para1, para2); unlock } //不会读取或者修改数据的接口 TypeReturn2 fun2(Type3 Para3, Type4 para4 ) { dataCollection->fun2(Para3, para4 ); } 。。。。。。 private: DataCollection* dataCollection; }
------解决方案--------------------
用的时候这么用
比如在某个类中:
- C/C++ code
//以前 class MyClass { void useDataCollection(Type1 para1, Type2 para2 ) {dataCollection->fun1(para1, para2);} private: DataCollection * dataCollection; } //现在可以变成 class MyClass { void useDataCollection(Type1 para1, Type2 para2 ) {dataCollection->fun1(para1, para2);} private: DataCollectionForThreadSafe* dataCollection; }
------解决方案--------------------
我想你可以去看一下设计模式中的 —— 适配器模式, 这应该对你有帮助