一。线程同步概念

二。互斥量(互斥锁)

1.pthread_mutex_init

2.pthread_mutex_destroy

3.pthread_mutex_lock(阻塞)

4.pthread_mutex_unlock

5.pthread_mutex_trylock(轮询尝试加锁 不阻塞)

6.互斥量示例
#include<pthread.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
pthread_mutex_t mutex; //定义互斥量
void *thread_func(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex); //子线程加锁
printf("hello ");
sleep(rand()%3);
printf("world
");
pthread_mutex_unlock(&mutex); //子线程解锁
sleep(rand()%3);
}
return 0;
}
int main()
{
pthread_mutex_init(&mutex,NULL); //初始化mutex=1
pthread_t thid;
srand(time(NULL));
pthread_create(&thid,NULL,thread_func,NULL);
while(1)
{
pthread_mutex_lock(&mutex); //主线程加锁
printf("HELLO");
sleep(rand()%3);
printf("WORLD
");
pthread_mutex_unlock(&mutex); //解锁
sleep(rand()%3);
}
pthread_mutex_destroy(&mutex);
return 0;
}
三。死锁

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
pthread_mutex_t mutex;
pthread_mutex_t mutex1;
void *thread_func(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
printf("child pthread...
");
sleep(3);
pthread_mutex_lock(&mutex1);
printf("child pthread...
");
sleep(3);
pthread_mutex_unlock(&mutex1);
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
return 0;
}
int main()
{
pthread_mutex_init(&mutex,NULL);
pthread_mutex_init(&mutex1,NULL);
pthread_t thid;
srand(time(NULL));
pthread_create(&thid,NULL,thread_func,NULL);
while(1)
{
pthread_mutex_lock(&mutex1);
sleep(3);
pthread_mutex_lock(&mutex);
sleep(3);
printf("main pthread...");
pthread_mutex_unlock(&mutex1);
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
pthread_mutex_destroy(&mutex);
pthread_mutex_destroy(&mutex1);
return 0;
四。读写锁

写锁优先级高

1.pthread_rwlock_ini
2.pthread_rwlock_destroy
3.pthread_rwlock_rdlock
4.pthread_rwlock_wrlock
5.pthread_rwlock_unlock
6.读写锁示例



五。条件变量
1.条件变量基本概念


2.pthread_cond_wait

3.pthread_cond_timedwait


4.pthread_cond_signal

5.pthread_cond_broadcast

6.生产者消费者模型
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<stdlib.h>
//静态初始化 条件变量和互斥量 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t has_product=PTHREAD_COND_INITIALIZER; typedef struct node{ int data; struct node* next; }Linklist; Linklist* head=NULL; Linklist* mp=NULL; void* producter(void *arg) { while(1) { mp=(Linklist*)malloc(sizeof(Linklist)); mp->data=rand()%100+1; printf("product--------%d ",mp->data); pthread_mutex_lock(&mutex); //得到互斥锁 mp->next=head; //生产 放入 共享池 head=mp; pthread_cond_signal(&has_product); //唤醒一个阻塞的线程 pthread_mutex_unlock(&mutex); sleep(rand()%3); } return 0; } void* consumer(void *arg) { while(1) { pthread_mutex_lock(&mutex); while(head==NULL) //若空,说明没有商品 { pthread_cond_wait(&has_product,&mutex); // 阻塞等待条件变量 ,释放互斥锁 } mp=head; //消费 head=head->next; pthread_mutex_unlock(&mutex); printf("consumer---------%d ",mp->data); free(mp); mp=NULL; sleep(rand()%3); } return 0; } int main() { pthread_t ptid,pcid; srand(time(NULL)); pthread_create(&ptid,NULL,producter,NULL); pthread_create(&pcid,NULL,consumer,NULL); pthread_join(ptid,NULL); pthread_join(pcid,NULL); return 0; }
7.条件变量优点

六。信号量
1.信号量基本概念



2.sem_init

3.sem_destroy

4.sem_wait

5.sem_post

6.信号量模拟生产者消费者模型
#include<stdio.h>
#define NUM 5 //缓冲区个数
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<semaphore.h>
sem_t buff; //信号量缓冲区
sem_t product; //信号量产品数
int data[NUM]; //临界区
void* producter(void *arg)
{
int i=0;
while(1)
{
sem_wait(&buff); //缓冲区个数--
data[i]=rand()%100+1; //生产
printf("produce------%d
",data[i]);
sem_post(&product); //产品数++
i=(i+1)%NUM;
sleep(rand()%4);
}
return 0;
}
void* consumer(void *arg)
{
int i=0;
while(1)
{
sem_wait(&product); //产品数--
printf("consumer------%d
",data[i]);
data[i]=0; //消费产品
sem_post(&buff); //缓冲区++
i=(i+1)%NUM;
sleep(20); //延迟20s
}
return 0;
}
int main()
{
pthread_t ptid,pcid;
srand(time(NULL));
sem_init(&buff,0,NUM); //初始化信号量buff为5
sem_init(&product,0,0); //初始化信号量product为0
pthread_create(&ptid,NULL,producter,NULL);
pthread_create(&pcid,NULL,consumer,NULL);
pthread_join(ptid,NULL);
pthread_join(pcid,NULL);
sem_destroy(&buff);
sem_destroy(&product);
return 0;
}
//缓冲区最多放5个产品,只有消费之后才能继续生产
