C语言如何在线程间实现同步和互斥

Python011

C语言如何在线程间实现同步和互斥,第1张

线程之间的同步和互斥解决的问题是线程对共同资源进行访问。Posix有两种方式:

信号量和互斥锁;信号量适用同时可用的资源为多个的情况;互斥锁适用于线程可用的资源只有一个的情况

1、互斥锁:互斥锁是用加锁的方式来控制对公共资源的原子操作(一旦开始进行就不会被打断的操作)

互斥锁只有上锁和解锁两种状态。互斥锁可以看作是特殊意义的全局变量,因为在同一时刻只有一个线程能够对互斥锁进行操作;只有上锁的进程才可以对公共资源进行访问,其他进程只能等到该进程解锁才可以对公共资源进行操作。

互斥锁操作函数:

pthread_mutex_init()//初始化

pthread_mutex_lock()//上锁参数:pthread_mutex_t *mutex

pthread_mutex_trylock()//判断上锁 参数:pthread_mutex_t *mutex

pthread_mutex_unlock()//解锁参数:pthread_mutex_t *mutex

pthread_mutex_release()//消除互斥锁 参数:pthread_mutex_t *mutex

互斥锁分为快速互斥锁、递归互斥锁、检错互斥锁;在 init 的时候确定

int pthread_mutex_t(pthread_mutex_t *mutex, const pthread_mutex_t mutexattr)

第一个参数:进行操作的锁

mutexattr:锁的类型,默认快速互斥锁(阻塞)123456789

2、信号量:信号量本质上是一个计数器,在操作系统做用于PV原子操作;

P操作使计数器-1;V操作使计数器+1.

在互斥操作中可以是使用一个信号量;在同步操作中需要使用多个信号量,并设置不同的初始值安排它们顺序执行

sem_init() // 初始化操作

sem_wait() // P操作,计数器减一;阻塞参数:sem_t *sem

sem_trywait() // P操作,计数器减一;非阻塞 参数:sem_t *sem

sem_post()// V操作,计数器加一 参数:sem_t *sem

sem_destroy() // 销毁信号量参数:sem_t *sem

sem_init(sem_t *sem, int pshared, int value)

pshared用于指定多少个进程共享;value初始值

整个程序以伪代码形式给出,当做一个提示吧,这样你就应该有思路了

生产者在存储区满时不能再生产,进入等待,消费者同理

完成同步互斥效果

/*----以下为代码部分-----*/

//定义全局变量

int empty = 1//信号量表示存储单元空,可以生产产品

int full = 0//信号量表示存储单元空,不可以消费产品

//P操作

void P(int &mutex)

{

*mutex--

if(*mutex<0)

{

//当前进程挂起的程序实现

}

}

//V操作

void V(int &mutex)

{

*mutex++

if(*mutex <=0)

{

//唤醒等待中的进程程序实现

}

}

//生产者程序

void producer()

{

P(&empty)//若此时存储区空,则可以生产,否则程序挂起等待

//生产一个产品操作

V(&full)//通知消费者进程,可以取产品

}

//消费者程序

void consumer(){

P(&full)//若此时存储区不空,则可以取产品,否则消费者程序挂起等待

//取走一个产品操作

V(&empty)//通知生产者进程可以生产

}

//主函数

void main()

{

//分别调用生产者,消费者程序,顺序不限,因为已经完成信号量的同步,若发生同步问题就会等待

producer();

consumer();

consumer();

producer();

………………

}

pthread_create(pthread_t *thread, pthread_attr_t * attr, void *(*start_routine)(void *),void *arg)创建线程(默认为同步线程)

线程的互斥函数有:互斥函数的初始化pthread_mutex_init(),互斥函数的锁定函数pthread_mutex_lock(),互斥函数的预锁定函数pthread_mutex_trylock(),互斥函数的解锁函数pthread_mutex_unlock(),互斥函数的销毁函数pthread_mutex_destroy()