加锁不是给线程上锁。
pthread_mutex_lock(&qlock)表示尝试去把qlock上锁,它会先判断qlock是否已经上锁,如果已经上锁这个线程就会停在这一步直到其他线程把锁解开。它才继续运行。
所以代码中要么是线程1先执行完后执行线程2,要么就是线程2先执行,再执行线程1.而线程3一开始就执行了。
互斥量mutex是用来给多线程之间的贡献资源上锁的。也就是同一个时间只允许一个线程去访问该资源(资源:比如对文件的写 *** 作)。
现在来回答楼主的问题:
不是只要在pthread_mutex_lock(&qlock)与pthread_mutex_unlock(&qlock)之间的代码执行,其他的都不能介入吗?
其他的都不能介入,不是整个进程只运行这一个线程,其他线程都停住了。
“不能介入“这个动作需要程序员自己设计来保证:好比前面提到的文件读写 *** 作。为了防止多个线程同时对文件进行写入 *** 作,这就需要把资源上锁了。
如果只有线程1加锁,那是不是这个锁就没有意义了呢?
这个理解可以有
unlock之后休眠一下pthread_mutex_unlock(&mutex)/*释放互斥锁*/
sleep(1)
pthread1 start running!
pthread2 start running!
gnum=:1
gsub=:99
gnum=:2
gsub=:98
gnum=:3
gsub=:97
gnum=:4
gsub=:96
gnum=:5
互斥锁是信号量的特例。信号量的初始值表示有多少个任务可以同时访问共享资源,如果初始值为1,表示只有1个任务可以访问,信号量变成互斥锁(Mutex)。1.同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。
2.使用中的互斥锁是不能被重新初始化的。
3.并且互斥锁不能用于中断上下文。
mutex结构体
mutex初始化
mutex加锁
mutex解锁
1、mutex初始化
a) 动态初始化
b) 静态初始化
2、mutex加锁
3、mutex解锁
drivers/input/evdev.c
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)