多线程 全局变量 加锁 作用范围 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,他是一个全局变量,如果某个线程拥有锁之后,不释放,其他线程就无法得到这个锁,也就保证了同时只有一个线程操作全局变量;
可实验结果不是这样,请帮忙解释一下,谢谢! 展开
CRITICAL_SECTION cs;
void PPPAR::function1() //对象PPPAR的成员函数
{
InitializeCriticalSection( & cs); // 初始化锁
EnterCriticalSection( & cs);
//处理代码,会对一个全局变量进行操作
LeaveCriticalSection( & cs); // 释放锁
DeleteCriticalSection( & cs); // 删除锁
}
在多线程程序中,每个现成的都创建一个PPPAR对象,我想请问上述加锁方式能够保证只有一个线程操作全局变量吗?
我的理解是:文件开头定义了一个锁cs,他是一个全局变量,如果某个线程拥有锁之后,不释放,其他线程就无法得到这个锁,也就保证了同时只有一个线程操作全局变量;
可实验结果不是这样,请帮忙解释一下,谢谢! 展开
5个回答
展开全部
如果所有线程都只读取该变量的话不必加锁,因为仅读取不存在破坏数据的风险,如果有线程写该变量的话不管读取还是写入都要加锁的。 windowsAPI提供了一种Sim读写锁,允许所有读线程在同一时刻访问该资源,而写线...
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
InitializeCriticalSection( & cs);这句不能放在函数内,整个程序内,调用一次就可以了,如放在main函数的开头。
因为每次进入函数时,这句代码就会初始化一个临界区,;放在函数内,会导致创建了很多临界区,所以无法起到互斥的变量。
CRITICAL_SECTION cs; 这只是定义了一个变量,并没有形成临界区。
因为每次进入函数时,这句代码就会初始化一个临界区,;放在函数内,会导致创建了很多临界区,所以无法起到互斥的变量。
CRITICAL_SECTION cs; 这只是定义了一个变量,并没有形成临界区。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
代码如下:
public static object locker = new object();//添加一个对象作为锁
就是在有修改的时候加上lock
lock (locker)//锁
{
/*添加过程*/
dictionary.Add("....", DateTime.Now);
}
public static object locker = new object();//添加一个对象作为锁
就是在有修改的时候加上lock
lock (locker)//锁
{
/*添加过程*/
dictionary.Add("....", DateTime.Now);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我的理解是每一个线程都有一个独立的对象就不存在线程安全问题,也没有了加锁的必要
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询