使用C/C++运行时库函数操作线程
Visual Studio包含了4个本机C/C++运行时库和2个用来管理MS.NET的C/C++运行时库。所有这些库都支持多线程编程环境:目前已经没有专门为单线程开发设计的C/C++运行时库了。表6-1对这些库进行了描述:
Libray Name
Description
LibCMt.lib
Statically linked release version of the library.
LibCMtD.lib
Statically linked debug version of the library.
MSVCRt.lib
Import library for dynamically linking the release version of the MSVCR80.dll library. (This is the default library when you create a new project.)
MSVCRtD.lib
Import library for dynamically linking the debug version of the MSVCR80D.dll library.
MSVCMRt.lib
Import library used for mixed managed/native code.
MSVCURt.lib
Import library compiled as 100-percent pure MSIL code.
当新建一个项目时,你应该知道当前项目链接的是哪一个库。在Visual Studio环境下,可以通过“项目属性”——“配置属性”——“C/C++”——“代码生成”——“运行时库”设置。
标准C运行时库是在1970年左右发布的,那时还没有线程这个概念,因此C运行时库的创造者们也没有意识到在多线程环境下使用C运行时库带来的问题。我们来举个例子,标准C运行时库中的全局变量errno用来表示最后一次函数调用的出错码,下面的代码段在多线程环境下可能会引发一些问题:
BOOL fFailure = (system("NOTEPAD.exe README.text") == -1);
if(fFailure){
switch(errno){
case E2BIG:
...
break;
case ENOENT:
...
break;
case ENOEXEC:
...
break;
case ENOMEM:
...
break;
}
}
假设当前线程在system调用后、if语句之前被中断,并且进程内的另外一个线程被调度且更改了errno的值,然后系统继续返回调度第一个线程,并判断errno,然而此时的errno已被另外的线程更改过,无法再准确的反应当system执行的状态了。为了解决这个问题,每个线程应该有自己的errno变量,此外应当保证每个线程只更改自己的errno而不会影响到其它线程。
这只是标准C/C++运行时库无法适应多线程环境的一个例子,事实上,在多线程环境下会出问题的C/C++运行时库变量和函数还包括(但不限于)_doserrno、strtok、_wcstok、strerror、
相关文档:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include ".\sqlite3_lib\sqlite3.h"
static int _callback_exec(void * notused,int argc, char ** argv, char ** aszColName)
{
int i;
for ( i=0; i<argc; i++ )
......
1.1.1 格式化输入输出函数
Turbo C2.0 标准库提供了两个控制台格式化输入、 输出函数printf( ) 和
scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。
printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入
设备(键盘)上读数据。下面详细介绍这两个函数的用法。
一、pr ......
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。
问题 ......
#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma 指令对每个编译器给出了一个方法,在保持与C 和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
一、#pragma message
#pragma ......
一、什么是B/S结构和C/S结构。
第一、什么是C/S结构。
C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目 ......