linux pthread_join&sigsetの使用例


簡単な例には説明しにくい問題がたくさん含まれているので、簡単な例が好きです.
また、ファイルはcppで命名されることが多い.c++compilerはcよりも友好的で、機能が強いからだ.例えば、勝手に変数を設定したり、bool変数のタイプをサポートしたりするなど...
pthread_join例
gitserver@gitserver-desktop:~/share/hjj$ cat pthread_join.cpp 
#include        <stdio.h>
#include        <unistd.h>
#include        <pthread.h>

void *MyThread(void *args)
{
        printf("I will exit after 5 senconds
"); sleep(5); } int main(int argc, char **argv) { printf("hello
"); pthread_t threadID; pthread_create(&threadID, NULL, MyThread,NULL); pthread_join(threadID, NULL); printf("bye, bye
"); return 0; }

簡単に説明します.
threadの関数プロトタイプはvoid*パラメータを持つ必要があります.void*は、タイプの関数を返します.
pthread_でcreateはスレッドを作成し、4つのパラメータ、スレッドはNULLで渡されません.
もっとmanで調べましょう.
コンパイル:
gitserver@gitserver-desktop:~/share/hjj$ gcc -g -o pthread_join pthread_join.cpp -lpthread
実行:
gitserver@gitserver-desktop:~/share/hjj$ ./pthread_join   hello I will exit after 5 senconds bye, bye
Signal set例
//signaltest.c
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
#include <time.h>
sigset_t gSigalSet;
void myfunc()
{
	printf("hello
"); } // // 1. , // 2 // 3. sleep , // 4. void *MyThread(void *p) { int signum; while(1){ sigwait(&gSigalSet,&signum); if(signum == SIGUSR1) { myfunc(); } else if(signum == SIGUSR2) { printf("I will sleep 2 second and exit
"); sleep(2); break; } } } // // 1. , // 2. // 3. // 4. 。 // 5. int main() { sigemptyset(&gSigalSet); sigaddset(&gSigalSet,SIGUSR1); sigaddset(&gSigalSet,SIGUSR2); sigprocmask(SIG_SETMASK,&gSigalSet,NULL); pthread_t threadID; int res=pthread_create(&threadID,NULL,MyThread,NULL); printf("threadID is 0x%lx, result is %d
", threadID,res); bool bRun = true; while(bRun) { printf(":>"); char c=fgetc(stdin); switch(c) { case 'a': pthread_kill(threadID,SIGUSR1); // SIGUSR1 , 。 break; case 'q': pthread_kill(threadID,SIGUSR2); // SIGUSR2 , , SIGKILL, 。 pthread_join(threadID,NULL); // threadID , 。 printf("finish
"); bRun=false; break; default: ; } } return 0; }
コンパイルおよび実行:
gitserver@gitserver-desktop:~/share/hjj$ gcc -o sigset sigset.cpp -lpthread gitserver@gitserver-desktop:~/share/hjj$ ./sigset threadID is 0xb782db70, result is 0 :>a :>:>hello q I will sleep 2 second and exit finish