日期:2014-05-16 浏览次数:20980 次
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
using namespace std;
pthread_t pid;
pthread_mutex_t mutex;
void sig_handler(int sig)
{
cerr << "handle signal" << endl;
if (sig == SIGUSR1)
pthread_exit((void*)0);
}
void th_clean(void* arg)
{
cerr << "th_f exit" << endl;
}
/*通过信号终止的处理函数*/
void* f(void* arg)
{
int oldstate;
if (pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate) )
cerr << "setcancel failed!" << endl;
int i = 0;
pthread_cleanup_push(th_clean, NULL);
if (signal(SIGUSR1, sig_handler) == SIG_ERR)
cerr << "signal failed!" << endl;
pthread_mutex_lock(&mutex);
while(1)
{
if (i == 100)
i /= 100;
i++;
//usleep(10); [size=24px] [b][color=#FF0000] //测试通过信号利用pthread_exit来终止线程是否成功,但发现不加usleep(10)时会出现
//terminate called without an active exception 然后程序崩溃。
[/color][/b][/size]
}
pthread_mutex_unlock(&mutex);
cerr << "unlock mutex!" << endl;
pthread_cleanup_pop(1);
return (void*)0;
}
/* 发信号的线程函数*/
void* f2(void* arg)
{
int kill_rc;
while (1)
{
kill_rc = pthread_kill(pid, SIGUSR1);
if (kill_rc == 0)
{
cerr << "signal send success" << endl;
break;
}
else if (kill_rc == EINVAL)
break;
}
cerr << "signal sound" << endl;
sleep(20);
return (void*)0;
}
int main()
{
pthread_t pidf2;
pthread_mutex_init(&mutex, NULL);
pthread_create(&pid, NULL, f, NULL);
sleep(5);
pthread_create(&pidf2, NULL, f2, NULL);
pthread_join(pidf2, NULL);
pthread_join(pid, NULL);
pthread_mutex_destroy(&mutex);
cerr << "main exit" << endl;
return 0;
}