读写锁

    读写锁是多线程同步中的一个很有用的东东,区分开读者和写者,有助于效率的提升。

    就好像是一个签名簿,写者相当于签名的人,读者相当于看签名簿的人,写签名簿的一群人需要排队,一个一个地签名,而读者不需要排队,他们可以一起看。当一群围观的正在看时,匆匆忙忙跑来一个签名的,大喊“让开,我要迟到了,让我签到”,于是大家让开让他签了名子,这说明了什么?

    1.写者比读者优先级高,同时竞争读写锁的话,写者将获得锁。

    2.写者必须一个一个地获得锁

    3.而一群读者可以同时获得读写锁。

 

下面一段程序说明了这个道理。


                                     编译:   gcc -o a rwlock.c -lpthread

                                     运行:   ./a

 

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

#define THREADCNT 10

pthread_rwlock_t rwlock;                                                  //建立读写锁
int global_var =  1;

void* reader(void* pvoid)
{
        pthread_rwlock_rdlock(&rwlock);                               //读方式获取锁
        sleep(1);
        printf("reader %d worked. global_var = %d\n", (int)pvoid, global_var);
        if(pthread_rwlock_unlock(&rwlock)) {
                printf("reader %d unlock error!\n", (int)pvoid);
        }
        return NULL;
}
void* writer(void* pvoid)
{
        pthread_rwlock_wrlock(&rwlock);                               //写方式获得锁
        sleep(1);
        printf("writer %d worked. global_var = %d\n", (int)pvoid, global_var++);
        if(pthread_rwlock_unlock(&rwlock)) {
                printf("writer %d unlock error!\n", (int)pvoid);
        }
        return NULL;
}
int main()
{
        pthread_t reader_id, writer_id;
        pthread_attr_t threadattr;
        int i, rand;
        int readercnt = 1, writercnt = 1;
        int halfmax = RAND_MAX / 2;
        if(pthread_rwlock_init(&rwlock, NULL)) {                     //初始化读写锁
                printf("initialize rwlock error!\n");
        }
        pthread_rwlock_wrlock(&rwlock);
        pthread_attr_init(&threadattr);
        pthread_attr_setdetachstate(&threadattr, PTHREAD_CREATE_DETACHED);
        for(i = 0; i < THREADCNT; i++) {
                rand = random();
                if(rand < halfmax) {
                        pthread_create(&reader_id, &threadattr, reader,
                                                (void*)readercnt);
                        printf("Created reader %d\n", readercnt++);
                } else {
                        pthread_create(&writer_id, &threadattr, writer,
                                                (void*)writercnt);
                        printf("Created writer %d\n", writercnt++);
                }
        }
        pthread_rwlock_unlock(&rwlock);
        pthread_exit(0);
        return 0;
}
 

 

运行结果:

 

Created writer 1
Created reader 1
Created writer 2
Created writer 3
Created writer 4
Created reader 2
Created reader 3
Created writer 5
Created reader 4
Created writer 6
writer 3 worked. global_var = 1
writer 4 worked. global_var = 2
writer 5 worked. global_var = 3
writer 2 worked. global_var = 4
writer 6 worked. global_var = 5
writer 1 worked. global_var = 6
reader 2 worked. global_var = 7
reader 3 worked. global_var = 7
reader 4 worked. global_var = 7
reader 1 worked. global_var = 7
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值