如何立即退出或停止线程?
当用户输入答案时,如何让它立即停止? 我想让它重置每一个问题。
这是涉及线程的代码
int q1() {
int timer_start;
char ans[] = "lol";
char user_ans[50];
timer_start = pthread_create( &xtimer,NULL,(void*)timer_func,(void*)NULL);
printf("What is the capital city of Peru?\n");
while(limit){
scanf("%s",user_ans);
if(limit)
{
if(!strcmp(user_ans, ans))
{
// printf("YAY!\n");
score++;
// q2();
}
else
{
game_over();
}
}
}
}
答案 0 :(得分:9)
您只需在该线程上调用pthread_cancel
即可将其退出。您可以通过pthread_kill
发送SIGSTOP / SIGCONT信号以停止/重新启动它。
但如果你想要的只是一个计时器,你为什么要穿线?
答案 1 :(得分:9)
根据您的代码,我可以给出一个简单的答案:
在这种情况下,根本不要使用线程。
你不需要它们。存储开始时间,让用户回答,在用户给出答案后再次检查时间。
{
time_t startTimeSec = time(NULL);
// answering
time_t endTimeSec = time(NULL);
time_t timeTakenSec = endTime-startTime;
if (timeTaken > 10) {
// do your thing
}
}
回答您的问题:
您应该使用互斥锁保护或volatile变量来在线程之间进行异步通信。从一个线程设置该变量并在另一个线程中检查它。然后重置其值并重复。一个简单的片段:
int stopIssued = 0;
pthread_mutex_t stopMutex;
int getStopIssued(void) {
int ret = 0;
pthread_mutex_lock(&stopMutex);
ret = stopIssued;
pthread_mutex_unlock(&stopMutex);
return ret;
}
void setStopIssued(int val) {
pthread_mutex_lock(&stopMutex);
stopIssued = val;
pthread_mutex_unlock(&stopMutex);
}
使用pthread_cancel()
是一个选项,但我不建议这样做。在此调用返回后,您必须检查线程状态,因为pthread_cancel()
不等待实际的线程停止。而且,对我来说更重要的是,我认为使用它很难看。
答案 2 :(得分:3)
使用方法来停止线程是一种蛮横的方式。 你应该礼貌地要求线程通过发信号停止。 因此,线程可以选择在自身之后整理,例如如果它已经分配了内存,那么如果线程被取消它将没有机会做。
该方法相对简单,不包含操作系统信令:
在线程外部定义线程状态变量或结构。在pthread_create指向它并取消引用线程中的状态变量。
int thread_state = 0; // 0: normal, -1: stop thread, 1: do something
static void *thread_1 (void *arg)
{
int* pthread_state = arg;
... // initialize the thread locals
while(1)
{
switch( *pthread_state )
{
case 0: // normal thread loop
...
break;
case -1:
... // tidy or whatever is necessary
pthread_exit(0); // exit the thread signalling normal return
break;
case 1: //
... // do something special
break;
}
}
}
pthread_create (&t_1, NULL, thread_1, (void*)&thread_state);
...
thread_state = -1; // signal to the thread to stop
// maybe use pthread_exit(0) to exit main.
// this will leave the threads running until they have finished tidy etc.
甚至可以使用结构与线程通信,只要它是简单的“原子”变量或建立简单的握手机制。否则可能需要使用互斥锁。 使用pthread_join等待线程终止。
答案 3 :(得分:0)
@Naruil打电话给 pthread_cancel()的建议几乎是我找到的最佳解决方案,但是如果你不做以下事情就行不通。
根据man-page of pthread_cancel pthread_cancelibility取决于两件事
thread_cancel_state PTHREAD_CANCEL_ENABLE ,所以我们主要关注 thread_cancel_type ,它的默认值是 PTHREAD_CANCEL_DEFFERED 但是我们需要 PTHREAD_CANCEL_ASYNCHRONOUS 来设置该线程,我们不会取消它。
以下给出一个例子::
#include <stdio.h>
#include <pthread.h>
void *thread_runner(void* arg)
{
//catch the pthread_object as argument
pthread_t obj = *((pthread_t*)arg);
//ENABLING THE CANCEL FUNCTIONALITY
int prevType;
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &prevType);
int i=0;
for( ; i < 11 ; i++)//1 - > 10
{
if(i == 5)
pthread_cancel(obj);
else
printf("count -- %d", i);
}
printf("done");
}
int main(int argc, char *argv[])
{
pthread_t obj;
pthread_create(&obj, NULL, thread_runner, (void*)&obj);
pthread_join(obj, NULL);
return 0;
}
使用 gcc filename.c -lpthread 运行它并输出以下内容:: 数 - 0 数 - 1 数 - 2 数 - 3 数 - 4
请注意,完成永远不会被打印,因为当i变为5&amp;时,线程被取消了正在运行的线程被取消了。特别感谢@Naruil提出的“pthread_cancel”建议。