一.前言
线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。
临界区是指访问某一共享资源的代码片段,并且这段代码的执行应为原子操作,也就是同时访问同一共享资源的其他线程不应终端该片段的执行。
二.什么交线程同步
线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作,而其他线程则处于等待状态。
三.实例
下面的例子将直观地向大家展示:多个线程竞争同一个共享资源时造成地线程同步问题
/*
使用多线程实现买票的案列
有三个窗口,一共是100张票
*/
#include <stdio.h>
#include <pthread.h>
#include <string.h>
//全局变量,所有的线程都共享这个资源
int tickets = 100;
void *sellticket(void *arg)
{
//买票
while(tickets > 0)
{
printf("线程%ld, 正在卖第 %d 张门票\n",pthread_self(),tickets);
tickets--;
}
return NULL;
}
int main()
{
pthread_t tid1,tid2,tid3;
pthread_create(&tid1,NULL,sellticket,NULL);
pthread_create(&tid2,NULL,sellticket,NULL);
pthread_create(&tid3,NULL,sellticket,NULL);
//阻塞回收
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid2,NULL);
//线程分离
// pthread_detach(tid1);
// pthread_detach(tid2);
// pthread_detach(tid2);
//主线程退出
pthread_exit(NULL);
return 0;
}