线程间同步===有序执行
1.信号量
2.条件变量+互斥锁
线程间互斥===有你没他(无执行顺序,CPU调度到哪个线程就哪个线程执行)
1.信号量
2.互斥锁
同步和互斥是为了什么?
为了保护临界资源
什么是临界资源?
静态变量,全局变量,系统资源
pthread_create()之前的全局资源—>有线程操作的全程资源—>变为临界资源
example:
信号量同步
/*************************************************************************
# FileName : pthreadsem.c
************************************************************************/
#include<stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define N 64
typedef struct message{
char buf[N];
int len;
}msg_t;
sem_t sem_reverse;
sem_t sem_printf;
void* reverse_msgbuf(void* arg)
{
msg_t *msg = (msg_t *)arg;
int i = 0;
char tmp;
while(1){
sem_wait(&sem_reverse);
printf("reverse_msgbuf -------------\n");
//printf("hello reverse_msgbuf.\n");
#if 1
for(i = 0; i < msg->len/2; i ++){
tmp = msg->buf[i];
msg->buf[i] = msg->buf[msg->len - i - 1];
msg->buf[msg->len - i -1] = tmp;
}
#endif
sleep(1);
printf("reverse_msgbuf :%s\n",msg->buf);
sem_post(&sem_printf);
}
}
void* printf_msgbuf(void* arg)
{
msg_t *msg = (msg_t *)arg;
while(1){
sem_wait(&sem_printf);
printf("printf_msgbuf :***********\n");
printf("printf_msgbuf :%s\n",msg->buf);
sem_post(&sem_reverse);
}
}
int main(int argc, const char *argv[])
{
msg_t msg = {"123456789",9};
pthread_t tid[2];
sem_init(&sem_reverse,0,1);
sem_init(&sem_printf,0,0);
pthread_create(&tid[0],NULL,reverse_msgbuf,(void *)&msg);
pthread_create(&tid[1],NULL,printf_msgbuf,(void *)&msg);
pause();
return 0;
}
条件变量+互斥锁(同步)
/*************************************************************************
# FileName : flaglock.c
************************************************************************/
#include<stdio.h>
#include <pthread.h>
#define N 64
typedef struct message{
char buf[N];
int len;
// int busy_flag;
}msg_t;
pthread_mutex_t mymutex;
pthread_cond_t mycond_reverse = PTHREAD_COND_INITIALIZER;
pthread_cond_t mycond_printf = PTHREAD_COND_INITIALIZER;
void* reverse_msgbuf(void* arg)
{
msg_t *msg = (msg_t *)arg;
int i = 0;
char tmp;
while(1){
pthread_mutex_lock(&mymutex);
pthread_cond_wait(&mycond_reverse,&mymutex);
printf("reverse_msgbuf -------------\n");
#if 1
for(i = 0; i < msg->len/2; i ++){
tmp = msg->buf[i];
msg->buf[i] = msg->buf[msg->len - i - 1];
msg->buf[msg->len - i -1] = tmp;
}
#endif
printf("reverse_msgbuf :%s\n",msg->buf);
pthread_mutex_unlock(&mymutex);
}
}
void* printf_msgbuf(void* arg)
{
msg_t *msg = (msg_t *)arg;
while(1){
pthread_mutex_lock(&mymutex);
pthread_cond_wait(&mycond_printf,&mymutex);
printf("printf_msgbuf :***********\n");
printf("printf_msgbuf :%s\n",msg->buf);
pthread_mutex_unlock(&mymutex);
}
}
int main(int argc, const char *argv[])
{
//msg_t msg = {"123456789",9,0};
msg_t msg = {"123456789",9};
pthread_t tid[2];
pthread_cond_init(&mycond_printf,NULL);
pthread_cond_init(&mycond_reverse,NULL);
pthread_mutex_init(&mymutex,NULL);
pthread_create(&tid[0],NULL,reverse_msgbuf,(void *)&msg);
pthread_create(&tid[1],NULL,printf_msgbuf,(void *)&msg);
while(1){
pthread_cond_signal (&mycond_printf);
sleep(1);
pthread_cond_signal (&mycond_reverse);
sleep(1);
}
pause();
return 0;
}
互斥锁(互斥)
/*************************************************************************
# FileName : flaglock.c
************************************************************************/
#include<stdio.h>
#include <pthread.h>
#define N 64
typedef struct message{
char buf[N];
int len;
}msg_t;
pthread_mutex_t mymutex;
void* reverse_msgbuf(void* arg)
{
msg_t *msg = (msg_t *)arg;
int i = 0;
char tmp;
while(1){
pthread_mutex_lock(&mymutex);
for(i = 0; i < msg->len/2; i ++){
tmp = msg->buf[i];
msg->buf[i] = msg->buf[msg->len - i - 1];
msg->buf[msg->len - i -1] = tmp;
}
pthread_mutex_unlock(&mymutex);
}
}
void* printf_msgbuf(void* arg)
{
msg_t *msg = (msg_t *)arg;
while(1){
pthread_mutex_lock(&mymutex);
printf("buf :%s\n",msg->buf);
pthread_mutex_unlock(&mymutex);
sleep(1);
}
}
int main(int argc, const char *argv[])
{
msg_t msg = {"123456789",9};
pthread_t tid[2];
pthread_mutex_init(&mymutex,NULL);
pthread_create(&tid[0],NULL,reverse_msgbuf,(void *)&msg);
pthread_create(&tid[1],NULL,printf_msgbuf,(void *)&msg);
pause();
return 0;
}