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;
    }
  • 相关阅读:
    互联网创业的葵花宝典
    null和undefined的区别
    mpc0.9编译方法
    gmp5.0.5编译
    为iphone及iphone simulator编译poco库
    binutils2.22编译心得
    为iphone及iphone simulator编译qt库
    sql server之触发器调用C#CLR存储过程实现两个表的数据同步
    poco之HttpRequest之get方法
    poco之HttpRequest之post方法
  • 原文地址:https://www.cnblogs.com/toosuo/p/2196183.html
Copyright © 2011-2022 走看看