// 出展
// http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10127304280
// 「MinGWでthreadのコンパイルができない」
// に対する、(同じ問題にぶつかっていた)江端のトライアル

// [Step.1] (私の場合)C:\mingw64の中に置かれていた"pthreads-w64.zip"を解凍
// (これ解凍されないまま、ここに置かれているみたい)
// C:\mingw64\pthreads-w64というディレクトリに展開される

// [Step.2] 中身をコピー
// C:\mingw64\pthreads-w64\binの中身を、C:\mingw64\binにコピー
// C:\mingw64\pthreads-w64\x86_64-w64-mingw32\include の中身を、C:\mingw64\x86_64-w64-mingw32\includeにコピー
// C:\mingw64\pthreads-w64\x86_64-w64-mingw32\lib の中身を、 C:\mingw64\x86_64-w64-mingw32\libにコピー
// したら、後は、何もしなくても(環境変数とかの設定も不要)で、以下のスレッドプログラムは動いた。

// gcc -g pthread.cpp -o pthread -lpthread

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <unistd.h> // usleep()に必要


// グローバル変数
char global_str[]="Grobal variable";
int i;

//スレッドとして動作させる関数
static void *kodomo(void *arg) 
{
  for(i=1;i<20;i++){
    fputs("サッチモ!",stderr);
    fflush(stderr); //溜めずにすぐに画面に出す
    //0〜999msecのランダム秒待つ
    usleep((rand()%1000)*1000);
  }
  printf("子からも%sが見えます\n",global_str);
    
  return NULL; //終了時、暗黙にpthread_exit()される
}

int main(void)
{ 
  //スレッド型変数の定義
  pthread_t thread1;
  
  //子スレッドを動かす
  if(pthread_create(&thread1,NULL,kodomo,NULL)!=0){
    return EXIT_FAILURE;
  }
  
  for(i=1;i<20;i++){
    fputs("ニッチモ!",stderr);
    fflush(stdout); //溜めずにすぐ画面に出す
    //0〜999msecのランダム秒待つ
    usleep((rand()%1000)*1000);
  }
  //子スレッドが終わるのを待つ
  if(pthread_join(thread1,NULL)!=0){
    return EXIT_FAILURE;
  }
  printf("親からも%sが見えます\n",global_str);
  //子スレッドが終わったら親も終了してよい
  return EXIT_SUCCESS;
}