linux多线程之信号量---疯狂打印abcd

来源:互联网 发布:php 字符串拼接函数 编辑:程序博客网 时间:2024/06/05 08:15
#include <stdio.h>#include <pthread.h>#include <fcntl.h>#include <semaphore.h>sem_t sem[4];void *handle(void *arg);int main(){   pthread_t tid[4];   int i;   for(i=0;i<4;i++)   {        if(i==0)           sem_init(&sem[i],0,1); //0号线程信号量初始值为1,保证开始时0号线程先打印;        else           sem_init(&sem[i],0,1); //1.2.3号线程信号量初始值为0;        pthread_create(&tid[i],NULL,handle,&i);    }    for(i=0;i<4;i++)    {       pthread_join(tid[i],NULL);       sem_destory(&sem[i]);    }    return 0; } void *handle(void *arg) {    char a='a';    int k=*((int *)arg);    while(1)    {       sem_wait(&sem[k]); //本线程信号量将减至0;       printf("%c",a+k);       sem_post(&sem[(k+1)%4]);//将下一个线程的信号量加至1,保证按顺序打印;    } }以上是完整代码,一个小问题,假如把handle函数改为如下所示,就会出错,why? void *handle(void *arg) {    while(1)    {       char a='a';       int k=*((int *)arg);       sem_wait(&sem[k]); //本线程信号量将减至0;       printf("%c",a+k);       sem_post(&sem[(k+1)%4]);//将下一个线程的信号量加至1,保证按顺序打印;    } }