线程的同步

线程的同步:用的是信号灯来实现
1. 线程信号灯的初始化
- 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;
}

 

posted @ 2022-05-15 18:59  孤走  阅读(15)  评论(0编辑  收藏  举报