fwrite_unlocked
在看muduo日志部分的时候,发现里面写文件使用的是fwrite_unlocked这个接口,之前没有见过,不过看名称就大体知道什么意思:fwrite的线程不安全版本。而且这样的接口有一个系列。因为没有用过,所以今天做了一个测试,方便以后使用。测试代码:
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <sys/time.h>#define THREAD_NUM 5FILE *fp;
pthread_t tid[5];
const char *str = "hello world\n";void *func(void *arg)
{struct timeval t1;struct timeval t2;gettimeofday(&t1, NULL);for (int i = 0; i < 100000; i++){fwrite_unlocked(str, 1, 12, fp);}gettimeofday(&t2, NULL);long us = (t2.tv_sec-t1.tv_sec)*1000000+t2.tv_usec - t1.tv_usec; printf("%ld\n", us);return NULL;
}int main(int argc, char *argv[])
{if (argc < 2){printf("%s file_name\n", argv[0]);return 1;}const char *file_name = argv[1];fp = fopen(file_name, "ae");for (int i = 0; i < 5; i++){pthread_create(&tid[i], NULL, func, NULL);}for (int i = 0; i < 5; i++){pthread_join(tid[i], NULL);}
}
代码很简单,就是在几个线程里循环使用fwrite_unlocked输出,验证其线程安全性。gcc fwrite_unlock.c -o fwrite_unlock -pthread -std=gnu99 编译运行后,打开写入的文件,使用:g/hello world/d命令将正确的打印删除,会发现有很多错误的打印,例如:
rld
rld
rld
rld
o world
rld
rld
rld
o world
rld
rld
hellold
rld
rld
然后将源码中的fwrite_unlocked改为fwrite,编译执行后,删除正确的打印,会发现内容为空,说明fwrite是线程安全的。
下面的对比两次的时间:
fwrite_unlocked:
75422
80007
84918
88741
88706
fwrite
240967
250791
255675
258284
258951
看起来差别好像确实挺大的,无锁版本明显要快很多。
fwrite_unlocked相关推荐
- muduo之FileUtil
FileUtil用来操作文件.AppendFile用来写日志,使用的fopen函数:ReadSmallFile使用open函数用来读取linux内核的一些信息. FileUtil.h // Use o ...
- C语言中巧妙的使用#和##
举个例子来说: 正常的定义一个结构体 的过程是 typdef struct __str__Student {char* name;int id; }Student; 但是当大量的使用结构体定义的时候会 ...
- c语言的详细编译过程
gcc编译c语言的整个编译过程可分为预编译->编译->汇编->链接 我们先编辑一个name.c文件 1 # include<stdio.h> 2 int main(int ...
- 随想录(gcc生成的中间语言、汇编代码)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 学过编译原理的朋友都知道,为了让编译器可以生成多种cpu后端代码,在这之前一般先将语法树翻译成中 ...
- 活跃了 40 年的 AWK 现在怎么样了?
[CSDN编者按]AWK是一种文本处理语言,距今已经历了40多年的发展.它支持POSIX标准,有几种符合标准的实现,在2020年居然仍然有着大量拥趸,无论是用于简单的文本处理任务还是用于处理" ...
- hello.i 预处理文件
预处理 hello.i 预处理文件是 hello.c C语言程序文件预处理之后的文件. 预处理是编译过程的第一个阶段.预处理器(cpp)根据以字节#开头的命令,修改原始的C程序.比如hello.c中第 ...
- 嵌入式linux开发笔记: gcc选项
fatal error: sys/cdefs.h No such file or directory 解决方案 在64位的ubuntu系统,使用gcc想编译出32位的应用程序,需要使用gcc - ...
- UNIX环境高级编程-第三版
Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...
- glibc 知:手册12:输入/输出流
文章目录 1. 前言 2. 输入/输出流 2.1. 流 2.2. 标准流 2.3. 打开流 2.4. 关闭流 2.5. 流和线程 2.6. 国际化应用程序中的流 2.7. 按字符或行的简单输出 2.8 ...
最新文章
- UI设计培训:UI设计师离不开的基本版式设计
- 【c语言】蓝桥杯算法训练 最大值与最小值的计算
- 工业大数据系统与应用北京市重点实验室给大家拜年啦!
- mysql 最长字符串_那些年的Mysql
- 我发现一个新的软件,用自然语言编程!非常酷!
- 【实用】ALV 清单右击隐藏列失效的处理
- JZOJ 5905. 【NOIP2018模拟10.15】黑暗之魂(darksoul)
- 【php学习笔记】ticks篇
- 链表怎么输出最后一个元素无空格_剑指offer系列----从尾到头打印链表
- 把本地仓库建到github
- java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?
- Java 的布局管理器GridBagLayout的使用方法【图文说明】
- Js中Proxy对象
- Hive文件存储格式和hive数据压缩
- steam计算机共享授权,steam共享游戏账号怎么授权
- 向彪fisco bcos入门教程,为了直观安装区块链浏览器(九)
- 蓝桥杯 ALGO-7 逆序对
- 逃离华强北后 他们去哪儿?采访身边真实故事——华强北电脑维修 内迁 张家界电脑维修 电子市场电脑维修
- 电容式触摸感应技术原理之自容式触摸按键电极设计建议(1)
- eps格式流程图制作流程