1、

int main()
{
	int i;
	for(i=0;i<2;i++)
	{
		fork();
		printf("-");
	}
return 0;
}



会有8个“-”

分析:一共调用了6次printf,但是会输出8个-。因为父进程的输出缓冲也会被子进程复制。

分析二:本来是有6个,但是由于printf有缓冲,在输出时会将-放大缓冲区,从而调用fork()时,会复制缓冲区的-到子进程中,多了两个-,所以是8个。

fork();//i=0
	printf("-");//buffer="-"
	fork();//i=1
		printf("-");//+1
	printf("-");
printf("-");
fork();//i=1
	printf("-");//+1
printf("-");



补充:



   fork

(函数)

 

点击打开链接


计算机程序设计中的分叉函数。 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。



fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。


 在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区等。


2、C++线程安全:

局部变局部使用是安全的。(因为每个thread都有自己的运行堆栈,而局部变量是生存在堆栈中,大家不干扰。)

全局原生变量多线程读写是不安全的,全局变量是在全局(静态)区中,而不是堆中。

函数静态变量多线程读写也是不安全的、

volatile不能保证全局整形变量是多线程的安全。(volatile仅仅告诫compiler不要对这个变量作优化,每次都要从memory取数值,而不是从register)

InterlockedIncrement保证整型变量自增的原子性


写好多线程安全的法宝是封装,使数据有保护的被访问到。

安全性: 局部变量>成员变量>全局变量


3、标准库里面的string在多线程下并不保证都是安全的,只提供两种安全机制:

1)多个线程同时读取数据是安全的

2)只有一个线程在写数据是安全的