关键代码段实现线程同步 本帖最后由 mwj1984 于 2009-08-06 22:05:08 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 EnterCriticalSection会标明哪些全局变量是受保护的变量,当一个线程调用EnterCriticalSection时,在关键部位肯定是原子执行的,如果某个全局变量被标记(即在调用EnterCriticalSection后调用LeaveCriticalSection前)其他的任何线程都将会在EnterCriticalSection内部等待,直到那个标记线程调用LeaveCriticalSection除去标记为止。还有注意把主线程修正一下,主线程仅仅等待4s就返回,会导致整个进程返回,很难看到效果 等待 4s也可以看到运行结果。是不是LeaveCriticalSection其他关键代码段竞争临界区对象的所有权呀 临界区:EnterCriticalSectionLeaveCriticalSection同一进程内(临界区只在进程内有效)的所有线程可以共享一个临界区对象(就是CRITICAL_SECTION 为类型定义的一个对象),当某个线程调用EnterCriticalSection成功而获得对该对象的所有权后(即通常讲的进入了临界区),所有其他的线程这时如果调用了EnterCriticalSection,那么线程将被阻塞在该API里面。然后如果原先获得临界区对象的所有权的线程调用LeaveCriticalSection而释放了临界区的所有权(即通常讲的离开临界区),那么之前因为调EnterCriticalSection而阻塞的线程将会有一个(而且只会有一个)线程醒来得到执行时间(也就是从EnterCriticalSection返回),这时候醒来的线程持有临界区对象的所有权,也就是进入了临界区,其他没有得到所有权的线程仍将继续保持阻塞在EnterCriticalSection之中,直到临界区对象被其持有者释放而使得等待临界区的线程有机会进入临界区。 若果有Sleep(4000)和sleep(1)时,各临界区获得临界区对象的所有权的模式是按 rulary(小星星)说的方式。但是如果去掉各个sleep(1)后各临界区获得临界区对象的所有权的模式又是怎样呢?是按时间片分配的吗?如果不是,又是怎样获得所有权的呢?我很疑惑 每打开一个工程 就少30M。。 如何去除参数的环境变量? 求旋转矩阵(聪明组合)算法 想了解双网卡问题的朋友请进来参与讨论! 求教问题多媒体API函数使用代码? 请问怎样才能获得当前线程的窗口句柄。。谢谢。 在发广播时,接收端怎样得到发送端的IP地址 回车键用二进制和ASCII码怎么表示?是'/r'吗?还是'/n'? 有一定难度的问题,高手请进! DXF和IGES的文件格式 消息响应对话框(VC++) 请问。如何用VC实现在Excel中画线
EnterCriticalSection
LeaveCriticalSection同一进程内(临界区只在进程内有效)的所有线程可以共享一个临界区对象(就是CRITICAL_SECTION 为类型定义的一个对象),当某个线程调用EnterCriticalSection成功而获得对该对象的所有权后(即通常讲的进入了临界区),所有其他的线程这时如果调用了EnterCriticalSection,那么线程将被阻塞在该API里面。然后如果原先获得临界区对象的所有权的线程调用LeaveCriticalSection而释放了临界区的所有权(即通常讲的离开临界区),那么之前因为调EnterCriticalSection而阻塞的线程将会有一个(而且只会有一个)线程醒来得到执行时间(也就是从EnterCriticalSection返回),这时候醒来的线程持有临界区对象的所有权,也就是进入了临界区,其他没有得到所有权的线程仍将继续保持阻塞在EnterCriticalSection之中,直到临界区对象被其持有者释放而使得等待临界区的线程有机会进入临界区。