C runtime lib 线程安全
周五开会做团队成员codereivew, 有同事提出了一个关于gmtime多线程是否安全的问题, 当时觉得程序Link了VC的多线程库,应该不是问题。还好回头核实了一下,发现了竟是一个潜在的bug。
程序分在application(完成项目特定功能)和framework(可重用的核心功能)两部分,线程的启动由framework完成。 app中使用了gmtime/localtime等C库函数。
gmtime/localtime等C函数是非线程安全的,这个n年前就知道, 也知道在Windows平台上VC有MT版本的runtime library,通过线程的局部存储(TLS)实现了/mt 链接时的线程安全。 然而线程的启动必须通过C运行时库的_beginthreadex, 而不是win32 API CreateThead 。不幸的的是当年framework的实现者貌似不清楚_beginthreadex与CreateThread的区别(BTW, 这个是当年进入第一家公司的一道面试题,所以印象颇为深刻),直接调CreateThread启动了线程。
解决方案调查中,VC CRT竟是没有gmtime_r/localtime_r。
参考资料:
http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/c727ae29-5a7a-42b6-ad0b-f6b21c1180b2
http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2006-02/msg00013.html
相关文档:
利用
下载的这段代码,成功实现了守护进程,原来守护进程是很简单的事情。
在main函数中执行
init_daemon();//初始化为Daemon
就可以把进程变成守护进程
#include
#include
#include
#include
#include
void
init_daemon(void
)
{
int
pid;
int
i;
if
(pid=fork()) ......
mmap是linux下的CreateFileMapping,用来映射并同步文件。
这样的话,比如我自定义一种文件格式,把它写入到文件中,现在想修改其中的值,就可以用这个函数,把文件映射到内存中
然后用操作数组的方式,来进行文件的同步。如果不用这个函数就得:
1、定义一个结构体
2、定义结构体数组
3、读取文件(w+)
4、修改文件 ......
鉴于在用C语言写一些字符串处理的程序时种种的不便,本人坚信"磨刀不误砍柴功"这个信条,于是在专门
进行了一次磨对C语言的磨刀,写了一些字符串的处理函数, 方便网友使用, 大家有好的解决方法也请告知一下.
我估计有一些C的库中肯定有比我这更好的函数, 但是本人没有找到, 望"行家"告知.
#include <string.h> ......