我最近开始根据 POSIX 1003.1c 学习 pthreads 的奇妙之处。
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
or不同而不同fprintf
。
当我使用时,write
我得到如下字母的随机输出:
Starting process a
aaaaaaaaaaaaaaaaaaaaaaaaaaaaStarting process b
aaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
但是当我使用时,fprintf
我总是得到类似于以下内容的输出:
Starting process a
Starting process b
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababbabaabaabaababbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
在这种情况下,文本“Starting process”总是首先出现,并且不会与输出的其余部分混合。为什么会这样?是因为write
非常快而且fprintf
比较慢吗?
作为一名 C 程序员,我应该使用哪一个,为什么?