linux pthread_join&sigsetの使用例
簡単な例には説明しにくい問題がたくさん含まれているので、簡単な例が好きです.
また、ファイルはcppで命名されることが多い.c++compilerはcよりも友好的で、機能が強いからだ.例えば、勝手に変数を設定したり、bool変数のタイプをサポートしたりするなど...
pthread_join例
簡単に説明します.
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例
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
また、ファイルは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