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;
}

posted on 2012-11-01 20:52  No.47  阅读(305)  评论(0)    收藏  举报

导航