为什么需要线程同步
因为在多线程环境中,线程之间由于竞争共享资源(临界资源)容易引起数据不一致的问题。一般采用互斥锁(互斥信号量)解决,保证只有一个线程进入临界区。
这篇文章就讲互斥锁,读写锁
互斥量(mutex):主要用于保护共享数据,确保同一时间只有一个线程访问数据。互斥量从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,访问完成后释放互斥量(解锁)。对互斥量进行加锁之后,任何其他试图再次对互斥量加锁的线程都会被阻塞直到当前线程释放该互斥锁。这样就可以保证每次只有一个线程可以向前执行。
读写锁(reader-writer lock):读写锁也叫做共享互斥锁(shared-exclusive
lock),它有三种状态:读模式下加锁状态、写模式下加锁状态、不加锁状态。一次只能有一个线程可以占有写模式的读写锁,但是多个线程可以同时战友读模式的读写锁。因此与互斥量相比,读写锁允许更高的并行性。读写锁非常适合对数据结构读的次数远大于写的情况。
方法1:互斥锁
实例代码:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
//使用宏定义以及初始化锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int sum = 0;
//线程函数1
void *thr1(void *arg)
{
while(1){
//上锁
pthread_mutex_lock(&mutex);
printf("hello");
sleep(rand()%3);
printf("world\n");
sleep(rand()%