C言語 - スレッド pthread - 簡単な例

クラウディア 
1. 概要
2. サンプル

1. 概要

 概要を書いたまま、放ったらかしだったので、一例ぐらい、サンプルを書いておきます(2021年10月12日)。  明確な目的があってプログラムを書く方が、ある意味楽ですな。  すれっどなんか、意味もなく、わいて起き上がらせるのってサンプルが書きにくいもです。  参考にさせていただくようなサイトも、なかなか見つからず・・・。  本ページは、下記のサイトを参考にさせていただきました。
C言語でのスレッド処理

2. サンプル

 こんな感じで書いてみました。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *my_thread(void *p)
{
	printf("thread start\n");
	printf("p = %2d\n", *(int*)p);
	*(int*)p += 1;
	printf("p = %2d\n", *(int*)p);

	printf("thread が終わるまで待ってね\n");

	return 0;
}

int main(void)
{
	int i;
	int a = 0;

	pthread_t pthread;
	pthread_create(&pthread, NULL, &my_thread, &a);

	printf("thread が終わるまで待つよ\n");

	pthread_join(pthread, NULL);

	printf("thread が終わったよ\n");
	printf("a = %2d\n", a);

	return 0;
}
 これ、「Clang」でコンパイル・リンクするには

clang ソースファイル名.c -pthread
 と「-pthread」をつけて「libpthread.a」だか「libpthread.so」だかのライブラリをリンクしてやる必要があります。  ま、「GCC」でも、似たようなものな、はずです。  このプログラムを実行すると

thread start
p =  0
p =  1
thread が終わるまで待ってね
thread が終わるまで待つよ
thread が終わったよ
a =  1
 だったり

thread が終わるまで待つよ
thread start
p =  0
p =  1
thread が終わるまで待ってね
thread が終わったよ
a =  1
 だったりします。  あえて、呼び出し側とスレッドの間で、同期をとっていないので、最後の2行より前にどういう順番で動くかは補償されません。  (あ、同じルーチン内は、もちろん上から下ですよ)
ハイスピードプラン