while(pThread->Resume() != 1) // 没有 Resume !!!!
解决方案 »
- 请问动态分配内存的指针怎么释放
- "ntddpack.h","conpack.h"两个文件
- VC++2005简单问题:如何给一个Button控件(或List、Combo等)设置“关联变量名”“关联变量类别”“关联变量类型”?
- 如何应用wabapi 函数 向IDistList 中插入联系人
- 我有一个server程序,一个client程序,想测试一下连接速度不知有啥办法?
- 用VC 访问 Oracle时,在Oracle服务器上产生线程过多的问题?
- 创建COM
- 如何更新CxxxView
- 报表
- 关于照相机参数的问题
- spi 程序中的所有例子的发给下层提供者总是不能成功。
- 不能将参数 1 从“WCHAR (*)[260]”转换为“WCHAR *”
return出线程,线程就结束了锁和同步是不同的概念,锁是保持同步的一种方法
如果多个线程访问同一个资源,要保持同步,否则,可能会崩溃,也可能会访问到脏数据
2.如果你担心的话,可以自己封装一个线程类,线程的挂起和恢复都自己控制,添加个变量,挂起+1,恢复-1之类的。
3.暴力退出法是TerminateThread,温柔法是想办法通知线程你现在在退出了,然后等待线程执行完退出。
4.只读不写不用加锁,用临界区来给内存加锁
2、不管你SuspendThread了几次 一次ResumeThread就激活了啊 好比你用一把锁锁门 难道锁10次你开10次?
3、你的线程函数退出 线程就完了 当然你也可以主动terminate掉线程
4.1、同步是统称 锁是保持同步的一种方法
4.2、一个写一个读不会 但有可能读到的是"脏"数据 具体百度google去了解
4.3、互斥锁就是我访问的时候不允许其他人访问 相当于数据独享操作
2、对的。while ( ResumeThread(hThread) > 1 ) {}
这样就可以保证恢复线程运行;
3、通知线程终止运行,方法多种,然后等线程内核对象触发(线程终止时其内核对象处于触发状态);
4、 1)锁是实现同步的机制,但是个模糊的说法,一般关键段(或称临界区)、读写锁、互斥体才称为锁,而同步的机制还有很多;
2)两个线程对同一内存进行读操作,不需同步,不用担心破坏内存;
一个线程读另一个线程写从安全上来说也不用加锁,但想每次读取的都是写后的完整数据,就需要加锁,有读有写一般用读写锁;
两个线程同时写也可以用读写锁,或者关键段,前者效率更高些,后者能够递归调用。
但当跨进程进行线程同步时,只能用内核对象:互斥体。
3)是互斥体吧?就是一种用于线程同步的内核对象,使线程独占对资源的访问。它和关键段是一样的,就是只有一个线程可以获取锁,从而被调度(即可以运行)。另外,希望4楼和5楼不要介意,我只是为了真理不得不说:
4楼说的第2点和3点,以及5楼说的,楼主千万别被误导。
3. 线程最好是让他自己return返回,在主线程结束之前最好是让所有的子线程先结束。,比如给子线程发消息,设置子线程退出标志,设置退出EVENT事件信号等等。
4. 同时读写同一个全局变量就需要加锁以保持同步。
5. 禁止多个线程同时进入受保护的代码“临界区”
第2点是错的 看了msdn 确实是计数 根据返回值可以知道调用之前的计数 不过我使用过程中没有出现需要SuspendThread多次这样的用法 所以主观认为:SuspendThread会判断当前状态如果是挂起状态直接返回成功
2:是的
3:程序退出线程会自动结束, 若要保证不出错误, 设置一个变量来控制线程结束, 等待线程结束后才退出.
threadfunc()
{
while(g_bStopthread){...;}
g_bStopthread = FALSE;
}
创建线程时g_bStopthread=FALSE, 退出前
g_bStopthread = TRUE;
while(g_bStopthread) {Sleep(100);}
....exit....4:
1)锁用来实现同步
2)不用锁会破坏, 读写同步要加锁等待.
3)互斥锁就是这边加了锁,那边就得等这边解锁后才能操作. 尽量用值传递的方式传参. 尽量少用全局变量.