printf是线程安全的吗

作者&投稿:休阁 (若有异议请与网页底部的电邮联系)
为什么 c 函数 是线程安全的~

如果是用VC编译器,想让printf函数变成线程安全的话,需要将项目设置中的c/c++的“代码生

你应该建立两个进程, 这样才可以观察, 还有你的 haha 是在 main 函数里面, 只执行一次, 不会输出多次, qiubai, 在进程中, 但是 if (a>0) 也就是执行一次之后这个进程虽然没有关闭但是, 已经不可能进入输出的程序了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

#include
#include
DWORD WINAPI myfun1(LPVOID lpParameter);
DWORD WINAPI myfun2(LPVOID lpParameter);
static HANDLE hmutex, hmutex2;
int main()
{
HANDLE h1;
h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL);
HANDLE h2;
h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL);
printf("Start:
");
Sleep(5000);
::CloseHandle(h1);
::CloseHandle(h2);
return 0;
}
DWORD WINAPI myfun1(LPVOID lpParameter)
{
int a = 0;
while (1)
{
::WaitForSingleObject(hmutex,INFINITE);
a++;
printf("qiubai
");
::ReleaseMutex(hmutex);
Sleep(200);
if(a > 15)
break;
}
return 0;
}
DWORD WINAPI myfun2(LPVOID lpParameter)
{
int b = 0;
while (1)
{
::WaitForSingleObject(hmutex2,INFINITE);
b++;
printf("haha
");
::ReleaseMutex(hmutex2);
Sleep(300);
if(b > 10)
break;
}
return 0;
}

printf最终还是要写入 stdout文件中的,因此输出到文件是线程安全的(系统支持)。但是当其参数中存在指针类型(字符串指针)时,在多线程环境下可能crash。比如一个线程中打印时所用的字符串(动态分配),在另一个线程中被delete,这样造成第一个线程打印时会报错。结论是printf的数据输出为线程安全,但数据输入可能会出现脏读而引发线程安全问题。

printf 应该是线程不安全的,具体原因一两句也说不清楚,建议你读一下

http://blog.csdn.net/yangmao1992/article/details/52264152
这个博客中写的,还是很容易理解的,希望对你有所帮助。

watching and waiting! What's he waiting for? What


ARM与Linux是什么关系?ARM本身已经有Linux了,还是需要往里烧写Linux...
2. ARM本身已经有Linux了,还是需要往里烧写Linux?很显然,你要往ARM里烧写linux才行。本身是不带的,不过有的ARM试验箱本身就有的,例如MagicARM2410,当然ARM也可以烧写其他系统,如winCE 3. ARM编写的程序,是直接控制io口?还是直接调用函数如(printf());如果你把端口配置成io口,当然可以直接...

VC++安装文件夹里面的CRT文件夹是做什么用的?
msvcrt.dll提供几千个C函数,即使是像printf这么低级的函数都在msvcrt.dll里。其实你的程序运行时,很大一部分时间时在这些运行库里运行。在你的程序(release版)被编译时,VC会根据你的编译选项(单线程、多线程或DLL)自动将相应的运行时库文件(libc.lib,libcmt.lib或Import library msvcrt.lib)链接进来...

java是最好的程序语言吗?
它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点。 2.简单 Java 语言简单是指这门语言既易学有好用。不要将简单误解为这门语言很干瘪。你可能很赞同这样的观点 英语要比阿了伯语言容易学。但这并不意味着英语就不能表达丰富的内容和深刻的思想,许多文学若贝尔奖的作品都是英文写的。如果你学习...

高并发的MySQL数据查询时,会不会选择数据库连接池?
现象 Sysbench对MySQL进行压测, 并发数过大(>5k)时, Sysbench建立连接的步骤会超时.猜想 猜想: 直觉上这很简单, Sysbench每建立一个连接, 都要消耗一个线程, 资源消耗过大导致超时.验证: 修改Sysbench源码, 调大超时时间, 仍然会发生超时.检查环境 猜想失败, 回到常规的环境检查:MySQL error log 未见...

StartServiceCtrlDispatcher()的作用是什么?
1。服务程序主函数(main):调用系统函数 StartServiceCtrlDispatcher 连接程序主线程到服务控制管理程序。2。服务入口点函数(ServiceMain):执行服务初始化任务,同时执行多个服务的服务进程有多个服务入口函数。3。控制服务处理程序函数(Handler):在服务程序收到控制请求时由控制分发线程引用。(此处是...

宁县15864185461: printf是线程安全的吗 -
訾左双红: printf最终还是要写入 stdout文件中的,因此输出到文件是线程安全的(系统支持).但是当其参数中存在指针类型(字符串指针)时,在多线程环境下可能crash.比如一个线程中打印时所用的字符串(动态分配),在另一个线程中被delete,这样造成第一个线程打印时会报错.结论是printf的数据输出为线程安全,但数据输入可能会出现脏读而引发线程安全问题.

宁县15864185461: printf() 是不是多线程安全的 -
訾左双红: 如果是用VC编译器,想让printf函数变成线程安全的话,需要将项目设置中的c/c++的“代码生成”的“运行时库”选为MT或者MTd, 否则该函数在多线程下测试会出问题,不信你可以写个多线程的程序测试下.

宁县15864185461: fprintf是线程安全的吗 -
訾左双红: 必须是线程安全的,可以仔细研读它的代码,看是如何做到线程安全的,无非就是用到我学过的多线程知识.

宁县15864185461: 为什么srand和rand不是线程安全的 -
訾左双红: struts1.1的每个action其实只对应一个实例(单例),而action本身又不带属性,如果你给其action加入了属性的话,那么,所有的请求都调用这个action,那么就共享这个数据了,但是,你加入的属性本身是没有进行线程安全的处理的(即加入synchronized等,因此是不安全的). struts1.1本身是采用单例来进行处理的,而且不考虑action有成员变量的问题,因此,它本身也就不用考虑线程安全的问题(毕竟考虑线程安全会增加系统开销的),但是你可以自己实现线程安全.

宁县15864185461: java int i; i++线程安全吗?为什么? -
訾左双红: i++是不安全的,因为java在操作i++的时候,是分步骤做的,可以理解为: tp = i; tp2 = i+1; i=tp2; 如果线程1在执行第一条代码的时候,线程2访问i变量,这个时候,i的值还没有变化,还是原来的值,所以是不安全的.

宁县15864185461: JAVA中线程安全的map有哪些? -
訾左双红: JAVA中线程安全的map有:Hashtable、synchronizedMap、ConcurrentHashMap.java中map中线程安全怎么实现:1. 同步的map就是Hashtable, concurrenthashmap.2. 你看到的Hashtable就是直接在hashmap上加了个锁,concurrenthashmap...

宁县15864185461: 什么是线程安全和线程不安全 -
訾左双红: 如果每个线程中对全局变量、静态变量只有读操作,而无写操作,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全. 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

宁县15864185461: 线程安全到底指的是什么 -
訾左双红: java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫线程安全: 如果你的代码所在的进程

宁县15864185461: java中++操作符是线程安全的吗 -
訾左双红: 你问的是java API中的哪些类是安全的?还是线程安全的意思?关于线程安全,是指当多个线程访问同一个变量时,该变量不会因为多线程访问产生意想不到的问题,为了避免多线程访问的不可预知的问题,对于程序中多线程能访问到的变量要加锁,即加synchronized,放在同步块中,或者对改变该变量值的方法加synchronized限制.当然jdk中自带的一些类本身就实现了该机制,本身就是线程安全的,比如StringBuffer,Vector等.多线程是程序中比较高级的一个方面,希望你能深入理解!

宁县15864185461: java 中为什么说,String是线程安全的 -
訾左双红: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 或者说:一个类或者程序所提供的接口...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网