您的位置:首页 > 其它

20 semaphore 2

2017-01-24 14:47 405 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: