• 使用读写锁


    /* 
    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;
    }
  • 相关阅读:
    [学]寻找mysql高并发解决方案(事务,行锁,事务隔离级别)
    [学]MYSQL中replace into的用法
    Dynamics CRM OData方式进行增删改查时报错的问题
    Get Form type using javascript in CRM 2011
    Dynamics CRM 同一实体多个Form显示不同的Ribbon按钮
    java中throw与throws
    Dynamics CRM 通过OData查询数据URI中包含中文的情况
    我是怎样阅读技术论文的
    Dynamics CRM2013/2015 禁止欢迎界面(Disable the Welcome Screen)
    社会化网络分析
  • 原文地址:https://www.cnblogs.com/toosuo/p/2196183.html
Copyright © 2020-2023  润新知