6045|14

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

100求解关于线程同步问题 [复制链接]

程序中的临界区
InitializeCriticalSection(&(pHWHead->RegCritSec));
....
DeleteCriticalSection(&(pHWHead->RegCritSec));
....
....
EnterCriticalSection(&(pHWHead->RegCritSec));
....
LeaveCriticalSection(&(pHWHead->RegCritSec));
其中pHWHead->RegCritSec定义为  CRITICAL_SECTION  RegCritSec

请问各位大侠:
1、EnterCriticalSection(&(pHWHead->RegCritSec));
   什么时候会使能这个函数,进入临界区??还是轮循的使能每个EnterCriticalSection(&(pHWHead->RegCritSec))临界区
2、这个函数实现的功能是不是可以用WaitForSingleObject来实现?
3、什么时候什么条件下需要用到线程同步??

谢谢各位!

最新回复

o  谢谢!  详情 回复 发表于 2008-8-26 13:44
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
请问各位大侠:
1、EnterCriticalSection(&(pHWHead->RegCritSec));
  什么时候使能这个函数,进入临界区??还是轮循的使能每个EnterCriticalSection(&(pHWHead->RegCritSec))临界区
2、这个函数实现的功能是不是可以用WaitForSingleObject来实现?
3、什么时候什么条件下需要用到线程同步??

谢谢各位!
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
第一个问题是:EnterCriticalSection(&(pHWHead->RegCritSec));
  什么时候使能这个函数,进入临界区??还是轮循的使能每个EnterCriticalSection(&(pHWHead->RegCritSec))临界区
第二个问题是:这个函数实现的功能是不是可以用WaitForSingleObject来代替实现?
第三个问题是:什么时候什么条件下需要用到线程同步??
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 
第一个问题,如果我没理解错,你的意思应该是进入临界区的使用方法,一般的情况是系统在同一时间只能为进程提供一个资源(或者一段代码的不能保证线程安全),那么为了保护这个资源,所以在进程内的几个线程都要访问该资源时,要提前进入临界区(此时其它进程将不能访问该资源),在访问结束后释放临界区.
第二个问题,可以.参考CREATEVENT 和SETEVENT.
第三个问题,当不同线程访问同一资源会造成意外发现时需要线程同步.
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
1. 一般来说 EnterCriticalSection(&(pHWHead->RegCritSec)); 在多个线程中被调用.第一个运行到这句代码的线程,会继续向下执行,进入临界区.直至调用LeaveCriticalSection(&(pHWHead->RegCritSec));离开临界区. 一旦有一个线程在临界区中,其他的线程执行到EnterCriticalSection(&(pHWHead->RegCritSec));均会被挂起.直至占有临界区的线程离开临界区,第一个被调度到线程进入临界区.
2.可以,不过会比较复杂,而且临界区只能在线程间使用,开销少.其他的同步机制均可用于进程间.
3.临界区主要用来保护共享资源在同一时间不会被多段代码访问,相当于锁.
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 

InitializeCriticalSection(&(pHWHead->RegCritSec)); 初始化

中间的多次使用
....
EnterCriticalSection(&(pHWHead->RegCritSec));
....
LeaveCriticalSection(&(pHWHead->RegCritSec));

释放资源,不能再被使用。
....
DeleteCriticalSection(&(pHWHead->RegCritSec));

这些知识在大学中都教过的。最好是找本书看明白。

1、
EnterCriticalSection
一次只能有一个线程访问被保护的资源。其它的线程等待。
LeaveCriticalSection
等待的线程根据某种机制选择一个进入临界区,其它继续等待。

还有一种是
TryEnterCriticalSection
如果不能进入临界区,就不会等待。
2、同步机制有多种,都可以使用。
但是不同的同步机制都有其优点和缺点。
根据不同情况,选择不同的机制,会优化代码和实现。

同步机制有的是系统内核对象,可以在不同进程中使用。
3、
有共享资源的时候。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
非常感谢大家
一般来说 EnterCriticalSection(&(pHWHead->RegCritSec)); 在多个线程中被调用.第一个运行到这句代码的线程,会继续向下执行,进入临界区.直至调用LeaveCriticalSection(&(pHWHead->RegCritSec));离开临界区. 一旦有一个线程在临界区中,其他的线程执行到EnterCriticalSection(&(pHWHead->RegCritSec));均会被挂起.直至占有临界区的线程离开临界区,第一个被调度到线程进入临界区.

就是说谁先进入临界区是按运行时间先后的,跟(&(pHWHead->RegCritSec))没关系吧

可以我想让哪个先进入临界区就让哪个先进入吗???
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
同一段代码肯定不行。

不同代码,也许加些判断。。。

会比较复杂。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
哦  非常非常感谢
3.临界区主要用来保护共享资源在同一时间不会被多段代码访问,相当于锁.
3、
有共享资源的时候


请问
这个共享资源是不是指的(&(pHWHead->RegCritSec))

还是指
EnterCriticalSection(&(pHWHead->RegCritSec));
....
LeaveCriticalSection(&(pHWHead->RegCritSec));
之间的代码所占用的内存资源??

或者是其他??

怎么能知道哪段是共享了资源、哪段需要共享资源???
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
在多个线程中同时使用的同一资源就是共享资源。

怎么能知道哪段是共享了资源、哪段需要共享资源???
这个由你的代码决定。

晕死了。找本书看就行了。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

11
 
EnterCriticalSection(&(pHWHead->RegCritSec));
....
LeaveCriticalSection(&(pHWHead->RegCritSec));
这个只是为了保护中间使用的某个共享资源。
例如一个全局变量,一个文件,一个硬件资源等等。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
haha  
不好意思,我菜鸟
我还想问另外一个问题:(&(pHWHead->RegCritSec))
这个参数的作用是什么
书上写的都是
指向CRITICAL_SECTION的结构指针

那么第一个运行到这句代码的线程,会继续向下执行

不需要做什么判断就继续向下执行了吗??
谢谢各位大侠了
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

13
 
我明白了
一般在
EnterCriticalSection(&(pHWHead->RegCritSec));
....
LeaveCriticalSection(&(pHWHead->RegCritSec));
之间都 有些对硬件或者中断的操作
如果进入了这段临界区
其他所有程序都不能访问这个硬件资源或者都不能对中断进行操作了


可是
:(&(pHWHead->RegCritSec))
这个参数的作用是什么
书上写的都是
指向CRITICAL_SECTION的结构指针

那么第一个运行到这句代码的线程,会继续向下执行

不需要做什么判断就继续向下执行了吗??
谢谢各位大侠了
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

14
 
这个参数是指明要进入哪个临届区。

如何判断是api的事情,不用你管。

你只要按api说明的这么写就行了。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

15
 
o  谢谢!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表