#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
//临界资源
char buf[] = "1234567";
sem_t sem,sem1;
void* callBack_print(void* arg)
{
while(1)
{
//---------------临界区---------------/
//p操作
if(sem_wait(&sem)<0)
{
perror("sem_wait");
break;
}
printf("%s\n",buf);
if(sem_post(&sem1)<0)//v操作
{
perror("sem_post");
break;
}
}
pthread_exit(NULL);
}
void* callBack_swap(void* arg)
{
char* start,*end;
char temp;
while(1)
{
if(sem_wait(&sem1)<0)
{
perror("sem_wait");
break;
}
start = buf;
end = buf+strlen(buf)-1;
while(start < end)
{
temp = *start;
*start=*end;
*end = temp;
start++;
end--;
}
if(sem_post(&sem)<0)
{
perror("sem_post");
break;
}
}
pthread_exit(NULL);
}
int main(int argc,const char *argv[])
{
//创建信号量
if(sem_init(&sem,0,1)<0)
{
perror("sem_init");
return -1;
}
if(sem_init(&sem1,0,0)<0)
{
perror("sem_init");
return -1;
}
pthread_t tid_p,tid_s;
if(pthread_create(&tid_p,NULL,callBack_print,NULL)!=0)
{
fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);
return -1;
}
pthread_detach(tid_p);//分离线程
if(pthread_create(&tid_s,NULL,callBack_swap,NULL)!=0)
{
fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);
return -1;
}
pthread_join(tid_s,NULL);
sem_destroy(&sem);
return 0;
}
将一个文件的数据打印到终端:a,一个线程读取文件的数据 b,另一个线程打印文件的数据
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
char buf[128] = "";
//信号量
sem_t sem1, sem2;
void* callBack_read(void* arg)
{
FILE* fp = fopen("./1.c", "r");
if(NULL == fp)
{
perror("fopen");
pthread_exit(NULL);
}
while(1)
{
if(sem_wait(&sem1) < 0) //P操作
{
perror("sem_wait");
break;
}
bzero(buf, sizeof(buf));
if(fgets(buf, sizeof(buf), fp) == NULL)
{
break;
}
if(sem_post(&sem2) < 0) //V操作
{
perror("sem_post");
break;
}
}
if(sem_post(&sem2) < 0) //V操作
{
perror("sem_post");
}
printf("文件读取完毕\n");
fclose(fp);
pthread_exit(NULL);
}
void* callBack_write(void* arg)
{
while(1)
{
if(sem_wait(&sem2) < 0) //P操作
{
perror("sem_wait");
break;
}
if(strlen(buf) == 0)
break;
printf("%s", buf);
fflush(stdout);
if(sem_post(&sem1) < 0) //V操作
{
perror("sem_post");
break;
}
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建信号量
if(sem_init(&sem1, 0, 1) < 0)
{
perror("sem_init_83");
return -1;
}
if(sem_init(&sem2, 0, 0) < 0)
{
perror("sem_init_89");
return -1;
}
//创建两个线程
pthread_t tid_r, tid_w;
//一个线程读取
if(pthread_create(&tid_r, NULL, callBack_read, NULL) != 0)
{
perror("pthread_create_99");
return -1;
}
//一个线程打印
if(pthread_create(&tid_w, NULL, callBack_write, NULL) != 0)
{
perror("pthread_create_106");
return -1;
}
//退出线程
pthread_join(tid_r, NULL);
pthread_join(tid_w, NULL);
//销毁信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
现有ID号为a,b,c的三个线程,每个线程的任务都是循环打印自己的ID号,要求打印的顺序为 A,B,C
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
#include <unistd.h>
sem_t sem1,sem2,sem3;
void* callbacka(void* arg)
{
while(1)
{
if(sem_wait(&sem1) < 0) //P操作
{
perror("sem_wait");
break;
}
printf("a");
if(sem_post(&sem2) < 0) //V操作
{
perror("sem_post");
return NULL;
}
}
pthread_exit(NULL);
}
void* callbackb(void* arg)
{
while(1)
{
if(sem_wait(&sem2) < 0) //P操作
{
perror("sem_wait");
break;
}
printf("b");
if(sem_post(&sem3) < 0) //V操作
{
perror("sem_post");
break;
}
}
pthread_exit(NULL);
}
void* callbackc(void* arg)
{
while(1)
{
if(sem_wait(&sem3) < 0) //P操作
{
perror("sem_wait");
break;
}
printf("c\n");
if(sem_post(&sem1) < 0) //V操作
{
perror("sem_post");
break;
}
}
pthread_exit(NULL);
}
int main(int argc,const char *argv[])
{
if(sem_init(&sem1, 0, 1) < 0)
{
perror("sem_init_83");
return -1;
}
if(sem_init(&sem2, 0, 1) < 0)
{
perror("sem_init_83");
return -1;
}
if(sem_init(&sem3, 0, 1) < 0)
{
perror("sem_init_83");
return -1;
}
pthread_t tida,tidb,tidc;
if(pthread_create(&tida,NULL,callbacka,NULL)!=0)
{
perror("pthread_create_11");
return -1;
}
pthread_detach(tida);
if(pthread_create(&tidb,NULL,callbackb,NULL)!=0)
{
perror("pthread_create_11");
return -1;
}
pthread_detach(tidb);
if(pthread_create(&tidc,NULL,callbackc,NULL)!=0)
{
perror("pthread_create_11");
return -1;
}
pthread_join(tidc,NULL);
sem_destroy(&sem1);
sem_destroy(&sem2);
sem_destroy(&sem3);
return 0;
}