zoukankan      html  css  js  c++  java
  • 多线程依次打印abcabc

    网络原题:

    编写一个程序,开启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("
    线程%d开始工作,我打印的是%c
    ",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("
    线程%d完成任务
    ",pthread_self());
    }
    int main(void) {
        pthread_t t[ITEM];
        int i=1;
        printf("共有%d个线程
    ",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
  • 相关阅读:
    vagrant 入门3
    vagrant 入门4
    vagrant 入门2
    Map、Debug追踪
    Comparator比较器 、Comparable接口
    File类
    Lambda表达式、函数式编程思想概述
    异常--异常体系、异常的处理、异常的捕获、finally语句块和自定义异常
    List集合、Set集合、Collection集合工具类
    数据结构---栈、队列、数组、链表和红黑树
  • 原文地址:https://www.cnblogs.com/sklww/p/3492997.html
Copyright © 2011-2022 走看看