vsprintf是线程安全的吗?

编译器1:VC6

编译器2:IAR for ARM 6.5

这个问题的另一个问法是:vsprintf有没有使用 全局变量?

VC6下有一份源码,看的云里雾里;IAR里没有源码。

如果要找一份有参考价值的代码,能否推荐一下?libc ? glibc?

有经验的大大请不吝赐教,谢谢!!

------解决方案--------------------

使用_beginthreadex开的线程应该就没问题

------解决方案--------------------

C库函数io都有同步的。不保证每次printf都是原子操作,但是线程安全应该是没问题的。

------解决方案--------------------

http://stackoverflow.com/questions/467938/stdout-thread-safe-in-c-on-linux

------解决方案--------------------

不是!

//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,

//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,

//在处理的时候每次从新buffer中取两个字节打印

#ifdef WIN32

#pragma warning(disable:4996)

#endif

#include

#include

#include

#ifdef WIN32

#include

#include

#include

#define  MYVOID             void

#define  vsnprintf          _vsnprintf

#else

#include

#include

#include

#define  CRITICAL_SECTION   pthread_mutex_t

#define  MYVOID             void *

#endif

//Log{

#define MAXLOGSIZE 20000000

#define MAXLINSIZE 16000

#include

#include

#include

char logfilename1[]="MyLog1.log";

char logfilename2[]="MyLog2.log";

static char logstr[MAXLINSIZE+1];

char datestr[16];

char timestr[16];

char mss[4];

CRITICAL_SECTION cs_log;

FILE *flog;

#ifdef WIN32

void Lock(CRITICAL_SECTION *l) {

EnterCriticalSection(l);

}

void Unlock(CRITICAL_SECTION *l) {

LeaveCriticalSection(l);

}

void sleep_ms(int ms) {

Sleep(ms);

}

#else

void Lock(CRITICAL_SECTION *l) {

pthread_mutex_lock(l);

}

void Unlock(CRITICAL_SECTION *l) {

pthread_mutex_unlock(l);

}

void sleep_ms(int ms) {

usleep(ms*1000);

}

#endif

void LogV(const char *pszFmt,va_list argp) {

struct tm *now;

struct timeb tb;

if (NULL==pszFmt

------解决方案--------------------

0==pszFmt[0]) return;

vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);

ftime(&tb);

now=localtime(&tb.time);

sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);

sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );

sprintf(mss,"%03d",tb.millitm);

printf("%s %s.%s %s",datestr,timestr,mss,logstr);

flog=fopen(logfilename1,"a");

if (NULL!=flog) {

fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);

if (ftell(flog)>MAXLOGSIZE) {

fclose(flog);

if (rename(logfilename1,logfilename2)) {

remove(logfilename2);

rename(logfilename1,logfilename2);

}

} else {

fclose(flog);

}

}

}

void Log(const char *pszFmt,...) {

va_list argp;

Lock(&cs_log);

va_start(argp,pszFmt);

LogV(pszFmt,argp);

va_end(argp);

Unlock(&cs_log);

}

//Log}

#define ASIZE    200

#define BSIZE    240

#define CSIZE      2

char Abuf[ASIZE];

char Cbuf[CSIZE];

CRITICAL_SECTION cs_HEX ;

CRITICAL_SECTION cs_BBB ;

struct FIFO_BUFFER {

int  head;

int  tail;

c语言 dll库是线程安全吗,vsprintf是线程安全的吗?解决思路相关推荐

  1. mysql从库应用负载_线上MySQL数据库高负载的解决思路--再次论程序应用索引的重要性...

    前言:过去的笔记整理而得,未免丢失,发布个人博客.[2012年的资料笔记] 场景:数据库的负载飙升,CPU高达99%. 查看进程.通过猜测推理,定位了一些select语句 363478427 | ap ...

  2. 易语言支持库配置闪退丨支持库配置崩溃_易语言打开支持库配置就闪退怎么办?

    易语言支持库配置闪退打不开怎么办? 易语言支持库配置闪退解决方法丨支持库配置崩溃_易语言打开支持 易语言支持库配置闪退丨支持库配置崩溃_易语言打开支持库配置就闪退怎么办? 很多人都遇到过 打开易语言支 ...

  3. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

    为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...

  4. 易语言 标准c 动态库,易语言Dll动态库的开发

    一.关于易语言DLL 易语言Dll动态库的开发是编程当中和其他语言开发进行交互必不可少的方法之一,从易语言3.6版开始,已经能够支持对DLL动态链接库的开发, 编译出的DLL是标准的DLL,和其他编程 ...

  5. vs2015制作供js调用的ATL组件dll库详解

    ATL组件和mfc ActiveX组件都可以供网页去调用,在我其它的博客中详细讲述了ocx组件的开发方式以及在网页中如何调用,在这篇博客中将详细讲解ATL组件的开发以及在网页中的调用. 1 创建ATL ...

  6. 防游戏检测之易语言DLL内存注入技术

    DLL注入,除了线程注入,消息钩子注入,输入法注入外,还有一种就是内存注入 那么什么是内存注入呢? 内存注入就是指内存中加载并且执行DLL文件,这样的注入方式好处有以下几点: 1.不需要把DLL文件暴 ...

  7. C运行库和C语言函数库/Microsoft C运行库

    C运行库和C语言函数库/Microsoft C运行库 2009-03-04 10:27 973人阅读 评论(0) 收藏 举报 c语言librarydll编译器fortran 1.C运行库和C语言函数库 ...

  8. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  9. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  10. 线程并发库和线程池的作用_线程和并发介绍

    线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...

最新文章

  1. ctime、mtime、atime
  2. 自定义时间格式 返回年月日
  3. 13.3.虚拟化工具--jinfo详解
  4. 首次使用eclipes运行项目报错“Java.lang.ClassNotFoundException”
  5. mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包
  6. leetcode 664. 奇怪的打印机(dp)
  7. Goobuntu:谷歌的内部桌面系统
  8. 【转载】Windows自带.NET Framework版本大全
  9. 百度搜索框智能提示功能代码
  10. si4438使用stm32f103配置调试成功!
  11. 鼎捷鼎新E10ERP软件介绍及资料
  12. c语言匀加速直线运动求位移,匀加速直线运动规律.doc
  13. Scale和Resolution的含义及转换算法
  14. 华为云MySQL云数据库,轻松助力数据上云
  15. Qt:warning: control reaches end of non-void function
  16. 史上最全Android版本号信息:)_我是亲民_新浪博客
  17. [转]Git详解之四 服务器上的Git
  18. 月薪超1.6万美元!对冲基金实习生也内卷
  19. 基于javaweb+springboot的物流快递在线寄查快递系统(java+SpringBoot+FreeMarker+Mysql)
  20. 如何把RGB图像的256色减少为16色、32色、64色

热门文章

  1. 市场大幅逆转速度达史上最快 宏观交易领域也被机器“占领”
  2. Julia : Formatting库的 fmt Base.@sprintf
  3. 以用户为师,报喜鸟用需求助力云备份产品创新
  4. eBPF Up Running: Overview
  5. 【优化算法】材料生成算法 (MGA)【含Matlab源码 209期】
  6. 【优化分类】基于matlab遗传算法结合爬山算法优化极限学习机分类【含Matlab源码 1660期】
  7. 【VRPSD】基于matlab蚁群算法求解运钞车路径规划问题【含Matlab源码 1511期】
  8. 卷积神经网络解决拼图_使用神经网络解决拼图难题
  9. 安装Scrapy失败的解决方法
  10. 一个icsp header和复位按钮。_手动火灾报警按钮的设置要求及检查方法