我有一个调用线程的C程序。
iret1 = pthread_create( &thread1, NULL, readdata, NULL);
iret2 = pthread_create( &thread2, NULL, timer_func, NULL);
pthread_join(thread2, NULL);
线程2在执行某些功能后返回,之后我想停止执行线程1.我应该怎么做?
答案 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