- 论坛徽章:
- 38
|
首先:
printf不用lock在多线程的程序里面打印确实是会出现乱码的,我是先发现打印的乱码问题才加入Lock的。
我看到ThreadSafePrint这个函数就已经皱眉头了. 写这个函数本身就说明你没有理解VC的库. 你写的是multi-thread库, 却和vc的single-thread库连接, printf能不出错?
其次:
位置不对,是否应该写成这样
CODE:[Copy to clipboard]#ifdef __DEBUG__
LockOn(&LockPrint);
printf(szMsg);
LockOff(&LockPrint);
#endif
为什么不全包括?
- #ifdef __DEBUG__
- if(!Initted)
- {
- InitLock(&LockPrint);
- Initted = true;
- }
- LockOn(&LockPrint);
- printf(szMsg);
- LockOff(&LockPrint);
- #endif
复制代码
如果是的话,原来的写法也是行得通的,只不过在无有__DEBUG__宏的时候空Lock了一次
并不会造成错误,不过考虑细致点的话,赞成你的说法。
你是在写库, 不是写应用程序, 库里面一大堆无用代码影响太大.
另外:
CWorkThread类的意图不知道楼上体会到没有,而是尽量让CWorkThread类的线程体跟具体的任务不要相关,把具体的任务跟CTask绑定了。
其实这个模型的最初样子是:
多个工作线程启动运行,任务对列中的任务是由主线程动态添加进去的,这样就能处理诸如消息转发,数据处理等发生效率比较高的任务,也就是任务对象的个数不限制或者未知的情况,只是由于那样做的话,CWorkThread要牵扯到释放内存,这个我还没有处理好,所以先作成现在这个模型。
最后:
initnetwork那个实现确实是由于我才疏学浅对windows下的一些东西并不是很懂,才勉强作成那样的。还有Lock这个操作到目前为止,只牵扯到Lock和UnLock两个方法,所以偷懒没有作成类。个人认为没有必要这样做
关于实现上的问题应该是比较容易修改的,但是类的设计上确是很重要的,如果CWorkThread类封装古怪,希望楼上给点意见,指出哪里不太合适,如果有更好的设计,欢迎赐教!
看了CWorkThread, mutex的实现, 其他部分我都没太细看, 但已经可以看出很多问题了. 如果你看过一些成熟的跨平台线程实现再来对比你的实现应该可以发现差距, CWorkThread没有重用性, mutex没封装等等, 建议你多看看别人的代码然后再写库, 库比程序的要求更高更严格. 象printf输出乱码的问题是基础, 你的基础有点不牢. 库对你来说还是偏难的任务, 对我也一样 |
|