不加锁的多线程售票系统存在的问题
- 售票系统实现代码
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int ticketAmout = 2; // 票的数量: 全局变量
void* ticketAgent(void* arg){
int t = ticketAmout;
if (t > 0){
printf("One ticket sold\n");
t--;
}else{
printf("Ticket sold out\n");
}
ticketAmout = t;
pthread_exit(0);
}
int main(int argc, char const* agrv[]){
//创建一个变量用于存储将要创建线程的tid
pthread_t ticketAgent_tid[2];
//创建线程并指定他们要执行的函数
for(int i = 0; i < 2; i++){
pthread_create(ticketAgent_tid+i, NULL, ticketAgent, NULL);
}
//针对主线程:要求主线程等待其他2个线程执行完毕后再执行后面的内容
for (int i = 0; i < 2; i++){
pthread_join(ticketAgent_tid[i], NULL);
}
sleep(1);
printf("The left ticket is %d\n", ticketAmout);
return 0;
}
s
其中int t = ticketAmout;if (t > 0){属于测试部分ticketAmout = t;属于设置部分,两者需要一气呵成才能让代码不出错
使用锁来实现同步
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int ticketAmout = 2; // 票的数量: 全局变量
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void* ticketAgent(void* arg){
// 上锁
pthread_mutex_lock(&lock);
int t = ticketAmout;
if (t > 0){
printf("One ticket sold\n");
t--;
}else{
printf("Ticket sold out\n");
}
ticketAmout = t;
// 解锁
pthread_mutex_unlock(&lock);
pthread_exit(0);
}
int main(int argc, char const* agrv[]){
pthread_t ticketAgent_tid[2];
for(int i = 0; i < 2; i++){
pthread_create(ticketAgent_tid+i, NULL, ticketAgent, NULL);
}
for (int i = 0; i < 2; i++){
pthread_join(ticketAgent_tid[i], NULL);
}
sleep(1);
printf("The left ticket is %d\n", ticketAmout);
return 0;
}
将临界区加上锁以实现同步