Linux 互斥锁详解
一、线程间互斥相关背景概念
共享资源与临界资源:多线程执行流被保护的共享资源叫做临界资源。每个线程内部,访问临界资源的代码,叫做临界区。
在进程虚拟地址空间中,内容可以被所有线程看到,称为共享资源。当多个线程同时并发地访问共享资源(如向显示器文件写入内容)时,可能会发生数据不一致问题。这种因多线程并发访问所产生数据不一致等问题的共享资源叫做临界资源。
互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。
生活中常见的例子是银行 ATM 机独立小房间,每次只能进去一个人,进去后锁门,出来前其他人需等待。这与互斥思想相似,只允许一个执行流进入临界区。
原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。
二、互斥量 mutex
2.1 为什么会出现问题?
以下是一个模拟售票系统的代码示例,四个线程抢票,未使用互斥保护共享资源 ticket:
int ticket = 1000;
void *route(void *arg) {
char *id = (char *)arg;
while (1) {
if (ticket > 0) {
usleep(1000);
printf("%s sells ticket:%d\n", id, ticket--);
} else {
break;
}
}
return (void*)0;
}
int main(void) {
pthread_t t1, t2, t3, t4;
pthread_create(&t1, NULL, route, (void *)"thread 1");
pthread_create(&t2, NULL, route, (void *)"thread 2");
pthread_create(&t3, , route, ( *));
(&t4, , route, ( *));
(t1, );
(t2, );
(t3, );
(t4, );
}


