zoukankan      html  css  js  c++  java
  • About Mutex

    mutex是一个互斥锁对象,互斥锁是为了防止多线程同时修改某一公共资源,我在下面的程序里把它“锁”在了一个叫buffer[10]的缓冲区 上,模型是2个Reader和2个Writer,Reader要等到叫buffer的书架上有书的时候才可以read,而Writer也必须在书架没有放 满的情况下才可以把新写的书放到书架上。我的程序里书架的大小是1,当然也可以设置书架的大小,不过实现过程大同小异。就不多说了。来看程序:

          

    #i nclude <stdio.h>
    #i nclude <pthread.h>
    
    void reader_function(void);
    void writer_function(void);
    
    char buffer[10]={0};
    int buffer_has_item=0;
    pthread_mutex_t mutex;
    
    int main(void)
    {
         pthread_t reader;
     
         /* 用默认属性初始化一个互斥锁对象*/
         pthread_mutex_init (&mutex,NULL);
         pthread_create(&reader,NULL, (void *)reader_function, NULL);
         writer_function();
     }
     
    void writer_function(void)
    {
        int i,ti;
    
        for(i=1;i<3;)
        {
            ti=i;
            /* 锁定互斥锁*/
            pthread_mutex_lock(&mutex);
            printf("Writer %d Locked Buffer.
    ",i);
            if (buffer_has_item==0)
            {
                buffer_has_item=1;
                strcpy(buffer,"Full");
                printf("++Writer %d fill the buffer with context "
    %s".
    ",i,buffer);
                i++;
            }
            /* 打开互斥锁*/
            printf("Writer %d Unlocked Buffer.
    
    
    ",ti);
            pthread_mutex_unlock(&mutex);
            sleep(1);
        }
     
    }
    
    void reader_function(void)
    {
        int i,ti;
        for(i=1;i<3;)
        {
            ti=i;
            pthread_mutex_lock(&mutex);
            printf("Reader %d Locked Buffer.
    ",i);
            if(buffer_has_item==1)
            {
                buffer_has_item=0;
                strcpy(buffer,"Empty");
                printf("--Reader %d clean the buffer with context "%s".
    ",i,buffer);
                i++;
            }
            printf("Reader %d Unlocked Buffer.
    
    
    ",ti);
            pthread_mutex_unlock(&mutex);
            sleep(1);
        }
    }

    编译:gcc -o mutex -lpthread -g mutex.c 运行:./mutex 结果: Reader 1 Locked Buffer. Reader 1 Unlocked Buffer.

    Writer 1 Locked Buffer. ++Writer 1 fill the buffer with context "Full". Writer 1 Unlocked Buffer.

    Writer 2 Locked Buffer. Writer 2 Unlocked Buffer.

    Reader 1 Locked Buffer. --Reader 1 clean the buffer with context "Empty". Reader 1 Unlocked Buffer.

    Writer 2 Locked Buffer. ++Writer 2 fill the buffer with context "Full". Writer 2 Unlocked Buffer.

    Reader 2 Locked Buffer. --Reader 2 clean the buffer with context "Empty". Reader 2 Unlocked Buffer.

    注意,这次用到的sleep()不再是为了让结果好看, 而是为了防止一个线程始终占用资源,很多网上的教程使用的是pthread_delay_np(&delay);这个语句,不过这个似乎只能在 solaris系统上用,linux还是用sleep()和usleep()好了,有高人说可能会使该线程所在的进程都sleep,我使用下来似乎没有发 现。而且似乎linux下本来就是一个进程里只有一个线程,忘记哪个手册上说的,也许是以前的版本,不追究了,能用就行。

    还 有就是在reader()和writer()里,我用了很奇怪的 i 和 ti 两个变量来对reader和writer编号,主要目的是为了保证每个Reader和Writer都能完成自己的使命,如果按照常规写法,使用for(i =1;i<3;i++)这样控制循环会使有的Reader或者Writer不能取到或者放上书。似乎说得自己都迷糊了,举例说,Reader1去取 书,恰巧这时候书架上是空的,为了保证Reader1能取到书,我就让Reader们排队,直到Reader1取到以后才轮到Reader2,对于 Writer们也实行排队

    http://hi.baidu.com/%BC%D0%B2%E3%D6%D0%B5%C4%BB%B0%CC%E2/blog/item/fff6a21e8f36e91f40341706.html

  • 相关阅读:
    Ajax实践学习笔记(三) Ajax应用模型
    代码之美
    Git 和Github初次使用 (转) Anny
    VisitsPageViewUnique Visitors: Metrics From GA Anny
    Building and Installing Node.js Anny
    Callback in NodeJS Anny
    Intall Apache & php on Ubuntu Anny
    [转载]Linux系统下超强远程同步备份工具Rsync使用详解 Anny
    Cannot Boot WEBrick: "WARN TCPServer Error: Address already in use " Anny
    chmod(转) Anny
  • 原文地址:https://www.cnblogs.com/funnylinux/p/3554793.html
Copyright © 2011-2022 走看看