zoukankan      html  css  js  c++  java
  • 使用读写锁

    /* 
    FileName: rwlock.c 
    Date: 20100310 
    Desc: g++ rwlock.c -lpthread -o demo 
          使用读写锁, 在读大于写情况下使用读写锁
    */  
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <signal.h>
    int isRun = 1;  // 程序运行标志
    struct ConfigInfo{
            pthread_rwlock_t rwlock;
            char path[128+1];
            int timeout;
    };
    void* thread_fun(void * arg)
    {
            struct ConfigInfo* p = (struct ConfigInfo*)arg;
            while (isRun)
            {
                    pthread_rwlock_rdlock(&p->rwlock);        // 加读锁
                    printf("tid=%ul, path=%s, timeout=%d\n", pthread_self(), p->path, p->timeout);
                    pthread_rwlock_unlock(&p->rwlock);  // 解锁
                    sleep(2);
            }
            return (void*)1;
    }
    void sig_fun(int signo)
    {
            isRun = 0;
    }
    int main(int argc, char* argv[])
    {
            signal(SIGINT, sig_fun);
            int i, ret;
            pthread_t tid[10];
            struct ConfigInfo info;
            pthread_rwlock_init(&info.rwlock, NULL); // 初始化读写锁
            for (i = 0;i < 10;i++)
            {
                    ret = pthread_create(&tid[i], NULL, thread_fun, (void*)&info);
                    if (ret != 0)
                    {
                            printf("%d. pthread_create() is Error\n", i);
                            exit(-1);
                    }
            }
            i = 0;
            while (isRun)
            {
                    if (i++%5 == 0)   // 某情况下,修改读写锁保护的数据结构。
                    {
                            pthread_rwlock_wrlock(&info.rwlock);  // 加写锁
                            memset(info.path, 0x00sizeof(info.path));
                            strcpy(info.path, "/home/pc/a.txt");
                            info.timeout = i%8;
                            pthread_rwlock_unlock(&info.rwlock);  // 解锁
                    }
                    sleep(1);
            }
            for (i = 0;i < 10;i++)
            {
                    ret = pthread_join(tid[i], NULL);
                    if (ret != 0)
                    {
                            printf("%d. pthread_join() is Error\n", i);
                            exit(-1);
                    }
            }
            pthread_rwlock_destroy(&info.rwlock); // 销毁读写锁
            return 0;
    }
  • 相关阅读:
    解决UITableView中Cell重用机制导致内容出错的方法总结
    Hdu 1052 Tian Ji -- The Horse Racing
    Hdu 1009 FatMouse' Trade
    hdu 2037 今年暑假不AC
    hdu 1559 最大子矩阵
    hdu 1004 Let the Balloon Rise
    Hdu 1214 圆桌会议
    Hdu 1081 To The Max
    Hdu 2845 Beans
    Hdu 2955 Robberies 0/1背包
  • 原文地址:https://www.cnblogs.com/toosuo/p/2196183.html
Copyright © 2011-2022 走看看