#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
sem_t *sem;
void *testThread(){
printf("Hello, World!New Thread1开始准备\n");
if(sem_wait(sem)==-1){//使用信号量
perror("线程1信号量等待失败");
exit(1);
}
printf("Hello, World!New Thread1开始使用\n");
sleep(5);
if(sem_post(sem)==-1){//释放信号量
perror("线程1信号量post失败");
exit(1);
}
printf("Hello, World!New Thread1结束\n");
}
void *testThread2(){
printf("Hello, World!New Thread2开始准备\n");
if(sem_wait(sem)==-1){//使用信号量
perror("线程2信号量等待失败");
exit(1);
}
printf("Hello, World!New Thread2开始使用\n");
sleep(5);
if(sem_post(sem)==-1){//释放信号量
perror("信号量post失败");
exit(1);
}
printf("Hello, World!New Thread2结束\n");
}
int main() {
//两种信号量
// //1、内存信号量,初始化信号量(注意macos上不允许创建内存信号量(无名信号量))
// if(sem_init(&sem, 0, 0)==-1){//保证只调用一次,通过第二个shared参数指明在同进程间(非零值)还是不同进程间(0)
// perror("内存信号量初始化失败");
// exit(1);
// }
// sem_wait(&sem);//使用信号量
// sem_post(&sem);//释放信号量
//2、有名信号量,初始化
sem=sem_open("/User/sumengnan/sem",O_CREAT,S_IRUSR|S_IWUSR,1);//总是在不同进程间共享
//O_CREAT表示当文件不存在,则创建
//S_IRUSR表示允许文件的所有者读。
//S_IWUSR表示允许文件的所有者写。
if(sem==NULL){
perror("创建有名信号量失败");
exit(1);
}
printf("Hello, World!\n");
pthread_t pthread_t,pthread_t2;
if(pthread_create(&pthread_t, NULL, testThread, NULL)==-1){
perror("创建线程1失败");
}
if(pthread_create(&pthread_t2, NULL, testThread2, NULL)==-1){
perror("创建线程2失败");
}
printf("%d",sleep(20));
//销毁资源
if(pthread_detach(&pthread_t)==-1){
perror("销毁线程1失败");
}
if(pthread_detach(&pthread_t2)==-1){
perror("销毁线程2失败");
}
//关闭有名信号量
if(sem_close(sem)==-1){
perror("关闭信号量失败");
}
//从系统中删除有名信号量
if(sem_unlink("/User/sumengnan/sem")==-1){
perror("删除有名信号量失败");
}
return 0;
}
执行结果:
结果:
Hello, World!
Hello, World!New Thread1开始准备
Hello, World!New Thread2开始准备
Hello, World!New Thread1开始使用
Hello, World!New Thread1结束
Hello, World!New Thread2开始使用
Hello, World!New Thread2结束
0