多线程编程是一件麻烦的事,记录一些想法。
1.基于对象
参考以前的一篇文章,别字较多。:}
2.使用代理
优选使用proxy进行线程间通信和数据共享。与主线程通信还可利用消息机制。
3.数据获取
3.1.const接口
用const成员函数暗示该接口不会引起资源竞争。
3.2.值语意
数据的获取,采用值语意回传,而不返回指针或引用。
4.操作请求
4.1.资源锁
提供基于资源的锁接口。
class lockable
{
public:
class locker
{
public:
locker( lockable &res ) : m_lockable( res )
{
m_lockable.lock();
}
~locker( void )
{
m_lockable.unlock();
}
private:
lockable &m_lockable;
}
void lock( void );
void unlock( void );
private:
...
};
4.2.间接资源
避免多实例访问同一资源,必要时采用资源锁。
5.线程隐藏
5.1.线程隐藏
将线程做为后台服务,内部处理所有线程同步问题,对外隐藏线程。
5.2.两套版本
为了避免同步代价,针对是否多线程使用提供两套版本,但接口保持一致,可包装多线程安全版本于特定namespace。
6.统一底层库
6.1.C运行库选择保持一致
6.2.包装底层运行库
仅在特定的dll里采用特定的底层库,避免对外部影响。
7.其它
这里是另外一些值得注意的地方。
7.1.API的线程安全
API会多进程调用,多线程问题基本不用考虑。
7.2._beginthread还是CreateThread
优选_beginthread,除非确信不用C库函数。
7.3.STL的多线程安全
采用多线程设置编译。否则,即使每线程本地容器也可能会导致崩溃。
7.4.static和singleton
避免多线程间接访问static成员或变量;确保多线程启动前,请求单件实例化。