多线程对一段代码加锁后,代码中函数中的变量是否也同样被加锁?
菜鸟入门,有些疑问请大家指点一下:多线程对一段代码进行加锁,而这段代码调用了很多函数,那么请问:加锁的意义是说:只有当这一段代码完全执行后,才能执行其他线程吗?可以对某个...
菜鸟入门,有些疑问请大家指点一下:
多线程对一段代码进行加锁,而这段代码调用了很多函数,那么请问:
加锁的意义是说:只有当这一段代码完全执行后,才能执行其他线程吗?
可以对某个全局变量加锁吗?还是说只能对某个代码段进行加锁? 展开
多线程对一段代码进行加锁,而这段代码调用了很多函数,那么请问:
加锁的意义是说:只有当这一段代码完全执行后,才能执行其他线程吗?
可以对某个全局变量加锁吗?还是说只能对某个代码段进行加锁? 展开
1个回答
展开全部
从计算机程序执行机制上说,其实只有变量可以加锁,而语言里面的所谓对代码段加锁,实际上也是由编译器或执行器自动生成一个临时变量用来加锁。加锁的意思是,如果某个线程锁住了某个变量,在他解锁那个变量之前,其他线程要想锁那个变量就会被阻塞。代码段加锁其实就是在那段代码开始的地方锁住了一个临时变量,到那段代码结束的时候再解锁,就可以防止别的线程与自己同时执行那段代码。但这不包括在那段代码中调用的函数,访问的变量,以及被调用的函数中的变量,因为你只锁了那个自动生成的临时变量,如果有别的程序通过别的代码段访问了中间的那些函数或者变量,是不受此限制的。
更多追问追答
追问
那么请问C++中可以锁定某个全局变量,使得同时只有一个线程可以访问?
追答
怎么说呢,所谓的被锁定的变量,在操作系统中其实是一些系统对象,比如semaphore,到底可以用什么对象跟用的操作系统有关,不过一般的操作系统都支持semaphore,这个跟操作系统原理里面说的是一致的,只是不同的系统调用的函数不一样,c++当然是可以用semaphore来加锁解锁的。之所以跟你说是锁变量,是因为我用java比较多,一下就想到那个上面去了,java是用变量(还是有点别扭,其实就是对象,比如object)来锁的,因为java的跨平台性,他并没有让你直接访问操作系统里面的某些概念。所以这里的“访问”需要明确一下,锁这个动作在同一时间是只有一个线程可以做的,但是访问变量本身是不受此限制的,锁只是通过变量传递到了比如说semaphore这种操作系统对象上,而不是把变量本身给锁了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |