【发布时间】:2013-02-26 00:13:40
【问题描述】:
我最近开始根据 POSIX 1003.1c 学习 pthread 的奇妙之处。
PThreads 可能看起来很复杂,但它们基本上是我们在类中用来创建并行行为的简单线程:https://computing.llnl.gov/tutorials/pthreads/
在我还在学习的时候,我的老师给了我们一个 C 代码来玩弄:
/* Creates two threads, one printing 10000 "a"s, the other printing
10000 "b"s.
Illustrates: thread creation, thread joining. */
#include <stddef.h>
#include <stdio.h>
#include <unistd.h>
#include "pthread.h"
void * process(void * arg)
{
int i;
fprintf(stderr, "Starting process %s\n", (char *) arg);
for (i = 0; i < 100; i++) {
write(1, (char *) arg, 1);
// fprintf(stdout, (char *) arg, 1);
}
return NULL;
}
int main()
{
int retcode;
pthread_t th_a, th_b;
void * retval;
retcode = pthread_create(&th_a, NULL, process, "a");
if (retcode != 0) fprintf(stderr, "create a failed %d\n", retcode);
retcode = pthread_create(&th_b, NULL, process, "b");
if (retcode != 0) fprintf(stderr, "create b failed %d\n", retcode);
retcode = pthread_join(th_a, &retval);
if (retcode != 0) fprintf(stderr, "join a failed %d\n", retcode);
retcode = pthread_join(th_b, &retval);
if (retcode != 0) fprintf(stderr, "join b failed %d\n", retcode);
return 0;
}
-
运行和编译说明(适用于 linux):
- 运行命令:`sudo apt-get install build-essential`
- 下载此代码(显然是 xD)
- 使用以下命令编译:`gcc -D_REENTRANT filenName.c -lpthread`
- 使用以下命令运行结果:`./a.out`
一切正常,但我不明白为什么我的输出顺序会因write 或fprintf 的使用而不同。
当我使用write 时,我会随机输出如下字母:
Starting process a
aaaaaaaaaaaaaaaaaaaaaaaaaaaaStarting process b
aaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
但是当我使用fprintf 时,我总是得到类似于以下内容的输出:
Starting process a
Starting process b
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababbabaabaabaababbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
在这种情况下,文本“Starting process”总是首先出现,并且不会与输出的其余部分混合。为什么会这样?是不是因为write 非常快而fprintf 比较慢?
作为一名 C 程序员,我应该使用哪一个?为什么?
【问题讨论】:
-
注释掉的
fprintf()行似乎完全错误。