线程的同步与互斥
相关背景概念
- 临界区 :每个线程内部访问自己资源的代码叫做临界区:
- 临界资源 :多个执行流共享的资源叫做临界资源
- 互斥 :在任何时刻,只能有且仅有一个执行流访问临界区的临界资源
- 原子性 :一个操作不会被任何调度机制打断,要么完成,要么没完成,只有两种状态,常见的++,–都不是原子操作,因为汇编代码不止一条
互斥量mutex
- 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。
- 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。
- 多个线程并发的操作共享变量,会带来一些问题。
我们模拟实现抢票系统说明:
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;
int tickets = 100; //临界资源
void* route(void* arg)
{
char* id = (char*)arg;
while(1)
{
if(tickets>0)
{
usleep(10000);
fflush(stdout);
cout<<