20 semaphore 2

本文通过两个示例展示了线程如何使用信号量和信号灯进行同步操作。第一个示例使用了 POSIX 信号量,第二个示例则利用了系统 V 信号灯。这些示例有助于理解线程间同步的基本概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 示例一:线程使用信号量

#include "stdio.h"
#include "stdlib.h"
#include "pthread.h"
#include "semaphore.h"
#include "unistd.h"

sem_t sem;
void *fun(void *var)//child thread code
{
  int j;
  //p  wait
  sem_wait(&sem);  //sleep
  for(j=0;j<10;j++)//second
  {
    usleep(100);
	printf("this is fun j=%d\n",j);
  }
 
}
int main()//main thread code
{
  int i;
  char str[]="hello linux\n";
  pthread_t tid;
  int ret;
  sem_init(&sem,0,0);//sem=0
  ret=pthread_create(&tid,NULL,fun,(void *)str);
  if(ret<0)
  {
	printf("creat thread failure\n");
	return -1;
  }
  for(i=0;i<10;i++)//first 
  {
	usleep(100);
	printf("this is main fun i=%d\n",i);
  }
  //v
  sem_post(&sem);
  while(1);
  return 0;
}

执行结果:

alex@alex-VirtualBox:~/Share/process/twenty$ gcc thread.c -lpthread
alex@alex-VirtualBox:~/Share/process/twenty$ ./a.out
this is main fun i=0
this is main fun i=1
this is main fun i=2
this is main fun i=3
this is main fun i=4
this is main fun i=5
this is main fun i=6
this is main fun i=7
this is main fun i=8
this is main fun i=9
this is fun j=0
this is fun j=1
this is fun j=2
this is fun j=3
this is fun j=4
this is fun j=5
this is fun j=6
this is fun j=7
this is fun j=8
this is fun j=9

2. 示例二,线程使用信号灯:

#include "stdio.h"
#include "stdlib.h"
#include "pthread.h"
//#include "semaphore.h"
#include "sys/ipc.h"
#include "sys/sem.h"
//sem_t sem;
union semun 
{	                
	int  val;  	/* Value for SETVAL*/
	struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
								                  
	unsigned short  *array;  /* Array for GETALL, SETALL */
												                 
	struct seminfo  *__buf;  /* Buffer for IPC_INFO(Linux-specific) */
};

int semid;
union semun mysemun;
struct sembuf mysembuf;
void *fun(void *var)//child thread code
{
  int j;
  //p  wait
 // sem_wait(&sem);  //sleep
  mysembuf.sem_op=-1;
  semop(semid,&mysembuf,1);
  for(j=0;j<10;j++)//second
  {
    usleep(100);
	printf("this is fun j=%d\n",j);
  }
 
}
int main()//main thread code
{
  int i;
  char str[]="hello linux\n";
  pthread_t tid;
  int ret;
  semid=semget(IPC_PRIVATE,3,0777);
  if(semid < 0)
  {
	printf("creat semaphore failure\n");
	return -1;
  }
  printf("creat semaphore sucess,semid=%d\n",semid);
  system("ipcs -s");
  mysemun.val=0;
  semctl(semid,0,SETVAL,mysemun);
  //sem_init(&sem,0,0);//sem=0
  mysembuf.sem_num=0;
  mysembuf.sem_flg=0;
  ret=pthread_create(&tid,NULL,fun,(void *)str);
  if(ret<0)
  {
	printf("creat thread failure\n");
	return -1;
  }
  for(i=0;i<10;i++)//first 
  {
	usleep(100);
	printf("this is main fun i=%d\n",i);
  }
  //v
 // sem_post(&sem);
  mysembuf.sem_op=1;
  semop(semid,&mysembuf,1);
  while(1);
  return 0;
}

执行结果:

alex@alex-VirtualBox:~/Share/process/twenty$ gcc sem.c -lpthread
alex@alex-VirtualBox:~/Share/process/twenty$ ./a.out
creat semaphore sucess,semid=32768

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 32768      alex       777        3

this is main fun i=0
this is main fun i=1
this is main fun i=2
this is main fun i=3
this is main fun i=4
this is main fun i=5
this is main fun i=6
this is main fun i=7
this is main fun i=8
this is main fun i=9
this is fun j=0
this is fun j=1
this is fun j=2
this is fun j=3
this is fun j=4
this is fun j=5
this is fun j=6
this is fun j=7
this is fun j=8
this is fun j=9


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值