线程的同步
线程的同步:用的是信号灯来实现
- 线程信号灯的初始化
-
include <semaphore.h>
-
sem_t sem; int
sem_init(sem_t *sem, int pshared, unsigned int value);
**编译时后面如**gcc xx.c -o xx -pthread
功能:
信号灯的初始化
参数: sem : 信号灯的标志
pshared : 0 —> 在当前进程中都可以使用该信号灯
value : 值 信号的灯的数量
返回值: 成功返回0 失败返回-1 并设置error -
实现信号灯的PV操作 P :减法操作
#include <semaphore.h>
int sem_wait(sem_t *sem);
功能: p操作,如果不够减,就阻塞等待
参数: sem : 信号灯
返回值: 成功返回0 失败返回-1 并设置error -
V :加法操作
#include <semaphore.h> int sem_post(sem_t *sem);
Link with -pthread.
功能: V操作 给value做加法操作 参数: sem : 信号灯
返回值:
成功返回0
失败返回-1 并设置error例子
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
sem_t sem;
void *show1(void *arg)
{
int b = 10;
while(--b){
sleep(1);
printf("I LOVEU\n");
}
sem_post(&sem);
pthread_exit(NULL);
return NULL;
}
void *show2(void *arg)
{
sem_wait(&sem);
int b =10;
while(--b){
sleep(1);
printf("gun\n");
}
pthread_exit(NULL);
//sem_post(&sem);
return NULL;
}
int main(void)
{
if(sem_init(&sem,0,0)){
perror("sem_init error");
exit(-1);
}
pthread_t thread1;///线程1
if(pthread_create(&thread1,NULL,show1,NULL)){
perror("pthread_create error");
exit(-1);
}
///设置分离属性分离属性
if(pthread_detach(thread1)){
perror("pthread_detach error");
exit(-1);
}
///创建线程2
pthread_t thread2;
if(pthread_create(&thread2,NULL,show2,NULL)){
perror("pthread_create error");
exit(-1);
}
//设置分离属性分离属性2
if(pthread_detach(thread2)){
perror("pthread_detach error");
exit(-1);
}
while(1);
return 0;
}