#include<unistd.h>
#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<semaphore.h>
#define SIZE 1024
//函数作用:使用信号量控制,读取输入,获得长度
void* thread_function(void* argv);
char buf[SIZE];
sem_t sem;
int main()
{
int res=0;
pthread_t pThread;
res=sem_init(&sem,0,0);
if(res!=0)
{
printf("sorry init sem failed\n");
return 0;
}
res=pthread_create(&pThread,NULL,thread_function,NULL);
if(res!=0)
{
printf("sorry create thread failed\n");
return 0;
}
//开始尽心循环输入
while(scanf("%s",buf))
{
sem_post(&sem);
if(strncmp(buf,"end",3)==0)
{
break;
}
}
printf("input end,waitting for thread finish\n");
res=pthread_join(&pThread,NULL);
if(res==0)
{
printf("thread finished successfully\n");

}
sem_destroy(&sem);
exit(0);
}
void* thread_function(void* argv)
{
sem_wait(&sem);
while(strncmp("end",buf,3)!=0)
{
printf("you input %d charaters\n",strlen(buf));
sem_wait(&sem);
}
pthread_exit(NULL);
}


sem_init是初始化信号量的操作

sem_post是一个原子操作。对一个信号量加1操作

sem_wait也是一个原子操作,信号量大于0则减一,立即返回,如果小于零则阻塞,如果等于零也是阻塞

如果信号量之前是2的话,sem_wait操作之后是1,同时不会等待,如果信号量是1的话,则sem_wait信号量变成了0,则会阻塞,不再继续执行,直到变成了非0值

pthread_join则是等待某个线程执行完成之后,继续向下执行,否则阻塞

,该函数主要是线程

1.开始sem是0,阻塞在sem_wait,然后,

2.用户输入,sem_post使得sem加一,sem_wait可以返回了

3.但是同时sem的值又变成了0,用户输入sem_post加一

4.sem_wait可以返回,进而输出输入字符串长度!