在C中终止一个线程

时间:2011-07-26 21:34:18

标签: c multithreading pthreads

我有一个调用线程的C程序。

iret1 = pthread_create( &thread1, NULL, readdata, NULL);
iret2 = pthread_create( &thread2, NULL, timer_func, NULL);
pthread_join(thread2, NULL);

线程2在执行某些功能后返回,之后我想停止执行线程1.我应该怎么做?

6 个答案:

答案 0 :(得分:8)

您可以使用pthread_cancel

停止该主题
pthread_cancel(thread1);

readdata

/* call this when you are not ready to cancel the thread */
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
...
/* call this when you are ready to cancel the thread */
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

有关详细信息,请参阅pthread_cancel man page - 其中包含一个示例。

如果您不想使用pthread_cancel,则可以使用由主线程设置并由线程1读取的全局标志。此外,您可以使用任何IPC方法,例如建立{{3}在线程之间。

答案 1 :(得分:2)

您应该向线程发出信号,表示您希望它停止工作,然后等待它执行此操作。例如,您可以设置线程定期测试的布尔标志。如果该标志指示已取消工作,则线程应从线程函数返回。

不要试图从外部强制终止线程,因为这会使同步对象处于不确定状态,导致死锁等。

答案 2 :(得分:2)

Thread1必须有一个标志,它会不时地验证它是否应该自行中止。

有一些方法可以从外部中止线程,但这非常危险。不。

类似的东西:

thread1stop=TRUE; //Thread 1 has access to this boolean value
pthread_join(thread1, NULL);

答案 3 :(得分:0)

您可以通过调用pthread_cancel(thread1)来停止thread1。

答案 4 :(得分:0)

tkill(tid,SIGTERM)是你所寻找的我相信的电话。

答案 5 :(得分:0)

pthread_cancel()函数向线程发送取消请求。

在发送取消线程的请求后,您应该检查返回代码以确认线程是否已被实际取消。

这是一个简单的例子:

rc = pthread_cancel(iret2);
if(rc) printf("failed to cancel the thread\n");

供进一步参考:

http://cursuri.cs.pub.ro/~apc/2003/resources/pthreads/uguide/users-39.htm

其他可能对您有用的来源。

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cancel.3.html