私は最近、POSIX1003.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プログラマーとして、どちらを使用する必要があり、その理由は何ですか?