多线程依次打印abcabc

时间:2021-11-12 18:31:39

网络原题:

编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输
出结果必须按ABC的顺序显示;如:ABCABC….依次递推

这里设置ITEM=4,即依次打印ABCDABCD……………………

#include <stdio.h>
#include <stdlib.h>
#include<pthread.h>
/*int pthread_create(pthread_t*restrict tidp,
 * const pthread_attr_t *restrict_attr,
 * void*(*start_rtn)(void*),void *restrict arg);*/
/*第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。*/
#define ITEM 4
struct {

    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int i;
}test={
    PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,0
};
void PrintA(void *arg)
{

    int num=*(int*)arg;
    int i;
    //printf("\n线程%d开始工作,我打印的是%c\n",pthread_self(),'A'+num);
    for(i=0;i<10;i++){
        pthread_mutex_lock(&test.mutex);
        while(test.i!=num)
            pthread_cond_wait(&test.cond,&test.mutex);
        printf("%c",'A'+num);
        test.i=(test.i+1)%ITEM;
        pthread_mutex_unlock(&test.mutex);
        pthread_cond_broadcast(&test.cond);

    }
    //printf("\n线程%d完成任务\n",pthread_self());
}
int main(void) {
    pthread_t t[ITEM];
    int i=1;
    printf("共有%d个线程\n",ITEM);
    for(i=0;i<ITEM;i++){
        int *a=(int *)malloc(sizeof(int));
        *a=i;
        pthread_create(&t[i],NULL,PrintA,a);
    }
    for(i=0;i<ITEM;i++){
        pthread_join(t[i],NULL);
        }
    return EXIT_SUCCESS;
}

运行结果:

共有4个线程
ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD