zoukankan      html  css  js  c++  java
  • Linux pthread多线程入门的问题求解答

    小弟初学多线程,做了一个读者写者问题的demo来学习这方面的知识。
    程序输入的格式是这样的,
    2 W 4 5
    3 R 5 2
    4 R 6 5
    5 W 5.1 3
    0 w 1 5

    贴出完整源代码是为了大家更深入的帮忙解答,但是实际上,大家之用看readerFirst()这一个函数和输出即可发现问题的所在

    input前边的第一个数字代表线程的index。w和r用于判断是写者还是读者,最后两个数字用于第一个是线程申请开始的时间,第二个是该操作持续的时间。当输入结束的话第一个数字输入0就可以了.
    根据输出,发现我的程序在readerFirst()这个函数的运行并不是并发的,而是根据调用pthread_create的调用的先后顺序运行的,表示很费解,希望高手指正

    /*
     *  多线程,读者优先
     */
    
    #include "stdio.h"
    #include <stdlib.h>
    #include <pthread.h>
    #include <time.h>
    
    
    #define N_WRITER 3 //写者数目
    #define N_READER 5 //读者数目
    #define W_SLEEP  1 //控制写频率
    #define R_SLEEP  1 //控制读频率
    
    
    pthread_t thread[100];
    const int MAX_RAND = 1000;//产生的最大随机数
    pthread_mutex_t writeLock = PTHREAD_MUTEX_INITIALIZER;//同一时间只能一个人写文件,互斥
    pthread_mutex_t accessReaderCnt = PTHREAD_MUTEX_INITIALIZER;//同一时间只能有一个人访问 readerCnt
    int data = 0;
    int readerCnt = 0;
    typedef struct params{
        int index;
        double begin,length;
    }params;
    double timeElapsed(){
        return (double)clock()/CLOCKS_PER_SEC;
    }
    
    void write()
    {
        int rd = rand();
        printf("write %d\n",rd);
        data = rd;
    }
    void read()
    {
        printf("read %d\n",data);
    }
    void * writer(void * in)
    {
        params *param=(params *)in;
        int index=param->index;
        double begin=param->begin,length=param->length;
        while(timeElapsed()<begin){
        }
    
        pthread_mutex_lock(&writeLock);
        begin=timeElapsed();
        printf("at %lf,%d writing thread starts\n",timeElapsed(),index);
        while(timeElapsed()<begin+length){
        }
        printf("at %lf,%d writing thread ends\n",timeElapsed(),index);
        pthread_mutex_unlock(&writeLock);
        sleep(W_SLEEP);
        pthread_exit((void *) 0);
    }
    
    void * reader (void * in)
    {
        params *param=(params *)in;
        int index=param->index;
        double begin=param->begin,length=param->length;
        while(timeElapsed()<begin){
        }
        pthread_mutex_lock(&accessReaderCnt);
        readerCnt++;
        if(readerCnt == 1){
            pthread_mutex_lock(&writeLock);
        }
        pthread_mutex_unlock(&accessReaderCnt);
        begin=timeElapsed();
        printf("at %lf,%d reading thread starts\n",timeElapsed(),index);
        while(timeElapsed()<begin+length){
        }
        printf("at %lf,%d reading thread ends\n",timeElapsed(),index);
    
        pthread_mutex_lock(&accessReaderCnt);
        readerCnt--;
        if(readerCnt == 0){
            pthread_mutex_unlock(&writeLock);
        }
        pthread_mutex_unlock(&accessReaderCnt);
        sleep(R_SLEEP);
        pthread_exit((void *) 0);
    }
    void readerFirst(){
        int threadNumber=0;
        char flags[100];
        struct params param[100];
        while(1){
            int index;
            double begin,length;
            char flag;
            scanf("%d ",&index);
            if(!index)
                break;
            scanf("%c %lf %lf",&flag,&begin,&length);
            flags[threadNumber]=flag;
            param[threadNumber].index=index;
            param[threadNumber].begin=begin;
            param[threadNumber].length=length;
            ++threadNumber;
        }
        int index=0;
        while(index<threadNumber){
            if(flags[index]=='W'){
                pthread_create(&thread[index],NULL,&writer,&param[index]);
            }
            else{
                pthread_create(&thread[index],NULL,&reader,&param[index]);
            }
            printf("%d thread start\n",index);
            pthread_join(thread[index],NULL);
            ++index;
        }
    
    }
    int main()
    {
        readerFirst();
        return 0;
    }
  • 相关阅读:
    推荐:俞敏洪的一分钟励志演讲
    信息系统开发平台OpenExpressApp - 内置支持的列表编辑方式
    WPF - 资源收集
    开源 - 开源协议
    信息系统开发平台OpenExpressApp - 总体架构的由来
    WPF - DataGrid 相关收集
    报表引擎 -架构描述
    推荐:图标编辑器
    Scrum之 回顾会议
    从买房来看软件有哪几个主要关注点
  • 原文地址:https://www.cnblogs.com/Kiro/p/2750275.html
Copyright © 2011-2022 走看看