多线程 全局变量 加锁 作用范围 70

file1.cppCRITICAL_SECTIONcs;voidPPPAR::function1()//对象PPPAR的成员函数{InitializeCriticalSe... file1.cpp

CRITICAL_SECTION cs;

void PPPAR::function1() //对象PPPAR的成员函数
{
InitializeCriticalSection( & cs); // 初始化锁
EnterCriticalSection( & cs);
//处理代码,会对一个全局变量进行操作
LeaveCriticalSection( & cs); // 释放锁
DeleteCriticalSection( & cs); // 删除锁
}

在多线程程序中,每个现成的都创建一个PPPAR对象,我想请问上述加锁方式能够保证只有一个线程操作全局变量吗?
我的理解是:文件开头定义了一个锁cs,他是一个全局变量,如果某个线程拥有锁之后,不释放,其他线程就无法得到这个锁,也就保证了同时只有一个线程操作全局变量;
可实验结果不是这样,请帮忙解释一下,谢谢!
展开
 我来答
浪迹天涯的流星
推荐于2017-10-01 · 知道合伙人教育行家
浪迹天涯的流星
知道合伙人教育行家
采纳数:8922 获赞数:81537
对于基本办公软件比较擅长。

向TA提问 私信TA
展开全部
InitializeCriticalSection( & cs);这句不能放在函数内,整个程序内,调用一次就可以了,如放在main函数的开头。
因为每次进入函数时,这句代码就会初始化一个临界区,;放在函数内,会导致创建了很多临界区,所以无法起到互斥的变量。
CRITICAL_SECTION cs; 这只是定义了一个变量,并没有形成临界区。
captaiskn
2015-03-10 · 超过14用户采纳过TA的回答
知道答主
回答量:179
采纳率:0%
帮助的人:29.9万
展开全部
如果所有线程都只读取该变量的话不必加锁,因为仅读取不存在破坏数据的风险,如果有线程写该变量的话不管读取还是写入都要加锁的。 windowsAPI提供了一种Sim读写锁,允许所有读线程在同一时刻访问该资源,而写线...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
铎谨Pv
2015-03-14
知道答主
回答量:17
采纳率:0%
帮助的人:6.5万
展开全部
InitializeCriticalSection( & cs);这句不能放在函数内,整个程序内,调用一次就可以了,如放在main函数的开头。
因为每次进入函数时,这句代码就会初始化一个临界区,;放在函数内,会导致创建了很多临界区,所以无法起到互斥的变量。
CRITICAL_SECTION cs; 这只是定义了一个变量,并没有形成临界区。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
超人影视娱乐
高粉答主

2015-09-05 · 闲来无事的影评人-关注我把
超人影视娱乐
采纳数:7757 获赞数:60597

向TA提问 私信TA
展开全部
代码如下:
public static object locker = new object();//添加一个对象作为锁
就是在有修改的时候加上lock
lock (locker)//锁
{
/*添加过程*/
dictionary.Add("....", DateTime.Now);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ronald935436
2015-03-10 · TA获得超过129个赞
知道小有建树答主
回答量:297
采纳率:50%
帮助的人:120万
展开全部
我的理解是每一个线程都有一个独立的对象就不存在线程安全问题,也没有了加锁的必要
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式