当前位置: 技术问答>unix/linux知识
iis7站长之家
关于Linux程序设计中多线程信号量的一个疑问
来源: 互联网 发布时间:2016-11-02
本文导语: 本人新手,目前在看Neil Matthew和Richard Stones的《linux程序设计》一书。在看第十二章12.5部分利用信号量对线程同步部分,对下面一个程序有点小小的疑问,先贴程序: #include #include #include #include #include #include...
本人新手,目前在看Neil Matthew和Richard Stones的《linux程序设计》一书。在看第十二章12.5部分利用信号量对线程同步部分,对下面一个程序有点小小的疑问,先贴程序:
#include
#include
#include
#include
#include
#include
void * thread_function(void *arg);
sem_t bin_sem;
#define WORK_SIZE 1024
char work_area[WORK_SIZE];
int main(){
int res;
pthread_t a_thread;
void *thread_result;
res=sem_init(&bin_sem,0,0);
if(res!=0){
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
res=pthread_create(&a_thread,NULL,thread_function,NULL);
if(res!=0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
printf("Input some text,Enter 'end' to finishn");
while(strncmp("end",work_area,3)!=0){
fgets(work_area,WORK_SIZE,stdin);
sem_post(&bin_sem);
}
printf("nWaiting for thread to finish...n");
res=pthread_join(a_thread,&thread_result);
if(res!=0){
perror("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joinedn");
sem_destroy(&bin_sem);
printf("main thread is overn");
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg){
sem_wait(&bin_sem);
while(strncmp("end",work_area,3)!=0){
printf("You input %d charactersn",strlen(work_area)-1);
sem_wait(&bin_sem);
}
printf("child thread is overn");
pthread_exit(NULL);
}
本人做了一点小小的修改,在主线程和子线程结束前加了一个打印语句。程序的意思是这样的:主线程负责从stdin中接受输入,并复制到工作区,释放信号量(+1),然后从进程接受到信号量后统计输入字符数。程序一输入"end"结束。
我的疑问是输入"end"后,主线程即结束循环,不会再释放信号量(sem_post(&bin_sem);此时的从线程应该还停留在sem_wait(&bin_sem),直到主线程结束而随之销毁。但是通过实验我们可以看出子线程在主线程结束之前执行了printf("child thread is overn");请问是什么原因使从进程没有停留在sem_wait(&bin_sem)这条语句往下执行了,谢谢!
#include
#include
#include
#include
#include
#include
void * thread_function(void *arg);
sem_t bin_sem;
#define WORK_SIZE 1024
char work_area[WORK_SIZE];
int main(){
int res;
pthread_t a_thread;
void *thread_result;
res=sem_init(&bin_sem,0,0);
if(res!=0){
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
res=pthread_create(&a_thread,NULL,thread_function,NULL);
if(res!=0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
printf("Input some text,Enter 'end' to finishn");
while(strncmp("end",work_area,3)!=0){
fgets(work_area,WORK_SIZE,stdin);
sem_post(&bin_sem);
}
printf("nWaiting for thread to finish...n");
res=pthread_join(a_thread,&thread_result);
if(res!=0){
perror("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joinedn");
sem_destroy(&bin_sem);
printf("main thread is overn");
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg){
sem_wait(&bin_sem);
while(strncmp("end",work_area,3)!=0){
printf("You input %d charactersn",strlen(work_area)-1);
sem_wait(&bin_sem);
}
printf("child thread is overn");
pthread_exit(NULL);
}
本人做了一点小小的修改,在主线程和子线程结束前加了一个打印语句。程序的意思是这样的:主线程负责从stdin中接受输入,并复制到工作区,释放信号量(+1),然后从进程接受到信号量后统计输入字符数。程序一输入"end"结束。
我的疑问是输入"end"后,主线程即结束循环,不会再释放信号量(sem_post(&bin_sem);此时的从线程应该还停留在sem_wait(&bin_sem),直到主线程结束而随之销毁。但是通过实验我们可以看出子线程在主线程结束之前执行了printf("child thread is overn");请问是什么原因使从进程没有停留在sem_wait(&bin_sem)这条语句往下执行了,谢谢!
|
是不是res=pthread_join(a_thread,&thread_result);
会向子线程发送什么信号量啊?
----------------------------
pthread_join()不会向子线程发送信号量的,它只是等待子线程的结束。
如果不调用pthread_join(),那么主线程结束后,整个进程就结束了,子线程也香消玉陨了
会向子线程发送什么信号量啊?
----------------------------
pthread_join()不会向子线程发送信号量的,它只是等待子线程的结束。
如果不调用pthread_join(),那么主线程结束后,整个进程就结束了,子线程也香消玉陨了