UNIX环境高级编程学习之第十一章线程-使用读写锁

Linux/Unix C/C++ xiujie 114℃ 0评论 已收录

UNIX环境高级编程学习之第十一章线程-使用读写锁

/* 
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, 0x00, sizeof(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;
}


喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址