线程的同步

本文介绍了如何在C语言中使用信号灯进行线程同步。通过`sem_init`初始化信号灯,`sem_wait`进行P操作(减法),`sem_post`执行V操作(加法)。示例代码展示了两个线程,线程1执行完特定任务后唤醒线程2,线程2在信号灯允许下继续执行。
摘要由CSDN通过智能技术生成

线程的同步

线程的同步:用的是信号灯来实现

  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值