线程间的互斥的同步一直是一个很重要的地方,在这里做个总结
所用的接口
- 创建线程的接口 返回0是成功,其他是失败
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
- 线程退出
void pthread_exit(void *retval);
- 线程回收 返回值为0是成功的
int pthread_join(pthread_t thread, void **retval);
- 开互斥锁和解互斥锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
- 等待条件变量和通知
int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex);
int pthread_cond_broadcast (pthread_cond_t *cond) ;
int pthread_cond_signal (pthread_cond_t *cond) ;
练习题:三个线程按照顺序打印 ‘A’ ‘B’ ‘C’
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#define PTHEAD_COUNT 3
char my_wait_flag = 'A';
int flag = 0;
pthread_mutex_t mutex_baiyu = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_baiyu=PTHREAD_COND_INITIALIZER;
void *pthread1(void *argv)
{
char param = (char)argv;
for(;;){
pthread_mutex_lock(&mutex_baiyu);
while(param != my_wait_flag)
pthread_cond_wait(&cond_baiyu, &mutex_baiyu);
printf("get thread_%lu param:%c\n",pthread_self(),param);
if(my_wait_flag=='C')
flag = 1;
else
flag = 0;
my_wait_flag++;
if(flag==1)
my_wait_flag = 'A';
pthread_mutex_unlock(&mutex_baiyu);
pthread_cond_broadcast(&cond_baiyu);
sleep(1);
}
pthread_exit(NULL);
}
int main()
{
int i = 0;
pthread_t tid[PTHEAD_COUNT];
char param[PTHEAD_COUNT] = {'A','B','C'};
for (i = 0; i < PTHEAD_COUNT; i++)
{
pthread_create(&tid[i], NULL, pthread1, (void *)param[i]);
}
for (i = 0; i < PTHEAD_COUNT; i++)
{
pthread_join(tid[i], NULL);
}
printf("parent exit\n");
return 0;
}
Makefile内容:
TARGET=pthr
CC=gcc
RM=rm
cflag=-o
lflag= -lpthread -w
src = $(shell ls *.c)
put = $(patsubst %.c,%.o,$(src))
$(TARGET):$(put)
$(CC) $(cflag) $@ $(src) $(lflag)
clean:
$(RM) -rf $(TARGET) *.o
make之后执行的log:
get thread_140014711187200 param:A
get thread_140014702794496 param:B
get thread_140014694401792 param:C
get thread_140014711187200 param:A
get thread_140014702794496 param:B
get thread_140014694401792 param:C
get thread_140014711187200 param:A
get thread_140014702794496 param:B
get thread_140014694401792 param:C