如果有三个线程R,W1,W2,共享一个缓冲器B,而B中每次只能存放一个数。当缓冲器中无数时,进程R可以将从输入设备上读入的数存放到缓冲器中。若存放到缓冲器中的时奇数,则允许进程W1将其取出打印;若存放到缓冲器中的时偶数,则允许进程W2将其取出打印。(1)写出三个并发线程能正确工作的描述代码。(2)写出能在Linux环境运行的三个并发线程C语言代码。

解决方案 »

  1.   

    附上代码,仅供参考,三个线程的同步..
    #include<iostream>
    using namespace std;
    #include <pthread.h>
    #include <semaphore.h>
    #include <pthread.h>
    #include <unistd.h>
    int buff;//bool first=false;
    pthread_cond_t read_cond=PTHREAD_COND_INITIALIZER;
    pthread_cond_t write1_cond=PTHREAD_COND_INITIALIZER;
    pthread_cond_t write2_cond=PTHREAD_COND_INITIALIZER;
    pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;void *Read(void *arg)
    { int i=1;
    while(1)
    {
    cout<<"in read ... "<<endl;
    pthread_cond_wait(&read_cond,&mutex);
    buff=i;
    if(i%2==0)
    {
    pthread_cond_signal(&write2_cond);
    }
    else
    {
    pthread_cond_signal(&write1_cond);
    }
    i++;
    } return NULL;
    }void *Write1(void *arg)
    {
    cout<<" in write1"<<endl;
    while(1)
    {
    pthread_cond_wait(&write1_cond,&mutex);
    if(!first)
    {
    first=true;
    }
    cout<<buff<<"  write one---"<<endl;
    buff=-1;
    pthread_cond_signal(&read_cond);
    } return NULL;
    }
    void *Write2(void *arg)
    {
    cout<<"in write2"<<endl;
    while(1)
    {
    pthread_cond_wait(&write2_cond,&mutex);
    cout<<buff<<"   write two---"<<endl;
    buff=-1;
    pthread_cond_signal(&read_cond);
    } return NULL;
    }int main()
    {
    pthread_t pid1,pid2,pid3;

    pthread_create(&pid1,NULL,Read,NULL);
    pthread_create(&pid2,NULL,Write1,NULL);
    pthread_create(&pid3,NULL,Write2,NULL); while(first == false )
    {
    pthread_cond_signal(&read_cond);
    usleep(10);
    } while(1)
    {

    usleep(2000);
    }

    pthread_join(pid1,NULL);
    pthread_join(pid2,NULL);
    pthread_join(pid3,NULL); pthread_cond_destroy(&read_cond);
    pthread_cond_destroy(&write1_cond);
    pthread_cond_destroy(&write2_cond);
    return 0;
    }