我有以下代码.构建应用程序是myprogram.
如果我启动myprogram然后killall myprogram,然后我立即启动myprogram,然后myprogram崩溃.
崩溃原因是由于第一次启动创建的管理线程在第二次启动之前未正确清除.
所以在第二次启动时,myprogram试图用pthread创建线程,旧的线程管理还没有被删除,所以它会导致崩溃.
有没有办法在我第一次启动时或在我第二次使用C启动时开始杀死管理线程?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_t test_thread;
void *thread_test_run (void *v)
{
int i=1;
while(1)
{
printf("into thread %d\r\n",i);
i++;
sleep(1);
}
return NULL
}
int main()
{
// ps aux | grep myprogram ---> show 1 myprogram (1 for the main application)
pthread_create(&test_thread, NULL, &thread_test_run, NULL);
// ps aux | grep myprogram ---> show 3 myprogram
// (1st for the main application)
// (2nd for the management thread. …Run Code Online (Sandbox Code Playgroud) 下面的程序为整个过程设置 SIG_ALRM 处理程序,创建一个线程,将 SIG_ALRM 信号发送到新创建的线程。在 SIG_ALRM 处理程序中调用 pthread_exit。结果 - 分段错误。如果你在发送信号之前睡觉 - 好的。
看起来在 pthread_exit 时刻没有启动新线程。我试图用 gdb 定位分段错误,但无法用 gdb 重现崩溃。
导致分段错误的原因是什么?
谢谢!
#include <signal.h>
#include <pthread.h>
#include <iostream>
#include <cassert>
using namespace std;
void* threadFunc(void* arg) {
cout << "thread: started. sleeping..: " << pthread_self() << endl;
sleep(10);
cout << "thread: exit" << endl;
return NULL;
}
void alrm_handler(int signo) {
cout << "alrm_handler: " << pthread_self() << endl;
pthread_exit(NULL); //if comment - no segmentation fault
}
int main() {
cout …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_t test_thread;
void *thread_test_run (void *v)
{
int i=1;
while(1)
{
printf("into thread %d\r\n",i);
i++;
sleep(1);
}
return NULL
}
int main()
{
pthread_create(&test_thread, NULL, &thread_test_run, NULL);
sleep (20);
pthread_cancel(test_thread);
sleep(100);
// In this period (before the finish of myprogram),
// I execute killall to kill myprogram
// I want to add a signal handle function to
// execute pthread_exit() before the program quit
}
Run Code Online (Sandbox Code Playgroud)
我想通过添加一个信号处理函数来在程序退出之前执行 pthread_exit() 来完成我的代码。
怎么做 ?