在看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相关推荐

  1. muduo之FileUtil

    FileUtil用来操作文件.AppendFile用来写日志,使用的fopen函数:ReadSmallFile使用open函数用来读取linux内核的一些信息. FileUtil.h // Use o ...

  2. C语言中巧妙的使用#和##

    举个例子来说: 正常的定义一个结构体 的过程是 typdef struct __str__Student {char* name;int id; }Student; 但是当大量的使用结构体定义的时候会 ...

  3. c语言的详细编译过程

    gcc编译c语言的整个编译过程可分为预编译->编译->汇编->链接 我们先编辑一个name.c文件 1 # include<stdio.h> 2 int main(int ...

  4. 随想录(gcc生成的中间语言、汇编代码)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 学过编译原理的朋友都知道,为了让编译器可以生成多种cpu后端代码,在这之前一般先将语法树翻译成中 ...

  5. 活跃了 40 年的 AWK 现在怎么样了?

    [CSDN编者按]AWK是一种文本处理语言,距今已经历了40多年的发展.它支持POSIX标准,有几种符合标准的实现,在2020年居然仍然有着大量拥趸,无论是用于简单的文本处理任务还是用于处理" ...

  6. hello.i 预处理文件

    预处理 hello.i 预处理文件是 hello.c C语言程序文件预处理之后的文件. 预处理是编译过程的第一个阶段.预处理器(cpp)根据以字节#开头的命令,修改原始的C程序.比如hello.c中第 ...

  7. 嵌入式linux开发笔记: gcc选项

    fatal error: sys/cdefs.h No such file or directory 解决方案   在64位的ubuntu系统,使用gcc想编译出32位的应用程序,需要使用gcc  - ...

  8. UNIX环境高级编程-第三版

    Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...

  9. glibc 知:手册12:输入/输出流

    文章目录 1. 前言 2. 输入/输出流 2.1. 流 2.2. 标准流 2.3. 打开流 2.4. 关闭流 2.5. 流和线程 2.6. 国际化应用程序中的流 2.7. 按字符或行的简单输出 2.8 ...

最新文章

  1. UI设计培训:UI设计师离不开的基本版式设计
  2. 【c语言】蓝桥杯算法训练 最大值与最小值的计算
  3. 工业大数据系统与应用北京市重点实验室给大家拜年啦!
  4. mysql 最长字符串_那些年的Mysql
  5. 我发现一个新的软件,用自然语言编程!非常酷!
  6. 【实用】ALV 清单右击隐藏列失效的处理
  7. JZOJ 5905. 【NOIP2018模拟10.15】黑暗之魂(darksoul)
  8. 【php学习笔记】ticks篇
  9. 链表怎么输出最后一个元素无空格_剑指offer系列----从尾到头打印链表
  10. 把本地仓库建到github
  11. java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?
  12. Java 的布局管理器GridBagLayout的使用方法【图文说明】
  13. Js中Proxy对象
  14. Hive文件存储格式和hive数据压缩
  15. steam计算机共享授权,steam共享游戏账号怎么授权
  16. 向彪fisco bcos入门教程,为了直观安装区块链浏览器(九)
  17. 蓝桥杯 ALGO-7 逆序对
  18. 逃离华强北后 他们去哪儿?采访身边真实故事——华强北电脑维修 内迁 张家界电脑维修 电子市场电脑维修
  19. 电容式触摸感应技术原理之自容式触摸按键电极设计建议(1)
  20. eps格式流程图制作流程

热门文章

  1. 模拟卷Leetcode【普通】1609. 奇偶树
  2. java 1~N阶乘之和的运算
  3. 数字签名(2) 协同签名
  4. Windows无法停用设备,原因是某个程序正在使用它
  5. python 数据标准化常用方法,z-score\min-max标准化
  6. 永中Office的新主人想干什么?
  7. vue使用腾讯位置服务获取当前位置
  8. 根据java实体类生成创建表sql步骤
  9. 2023 届校招薪资爆料汇总
  10. 互联网产品中为什么“细节决定成败”。——欢迎补充