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;
    }
  • 相关阅读:
    模拟登陆并爬取Github
    Python学习--猫眼电影TOP100榜单抓取
    MATLAB拟合和插值
    Python学习--两种方法爬取网页图片(requests/urllib)
    md5码加密(Python)
    【Docker】Dockerfile 之 ENTRYPOINT(三)
    【Docker】Dockerfile 之 ENTRYPOINT(二)
    CSS---选择器种类 | 层叠性权重
    HTML---引入css,js | 常用标签示例
    DB2批量插入性能对比
  • 原文地址:https://www.cnblogs.com/toosuo/p/2196183.html
Copyright © 2011-2022 走看看