问题: 创建一个程序,接收用户输入但在一定时间后超时(暂定为2秒)。
方法: 我创建了两个线程,一个等待用户输入(inputThread
,使用tid[0]
),另一个休眠2秒钟(sleepThread
,使用tid[1]
)。我通过另一个线程的例程来取消一个线程,如下所示:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_t tid[2];
void* inputThread()
{
int n;
printf("Enter number:");
// wait for input; if input is given then go ahead and cancel the sleeper thread.
scanf("%d",&n);
// cancel the sleeper thread
pthread_cancel(tid[1]);
printf("Got value:%d\n",n);
}
void* sleepThread()
{
// sleep for 2 seconds and cancel the input thread.
sleep(2);
// cancel the input thread
pthread_cancel(tid[0]);
printf("\nNo value entered!\n");
}
int main(int argc, char const *argv[])
{
int r1,r2,r3,r4;
// input taking thread
r1 = pthread_create(&tid[0],NULL,inputThread,NULL);
// sleeping thread
r2 = pthread_create(&tid[1],NULL,sleepThread,NULL);
r3 = pthread_join(tid[0],NULL);
r4 = pthread_join(tid[1],NULL);
return 0;
}
目前为止,该程序按预期运行。但我的朋友说它不保证能够工作,因为它取决于线程如何调度。他试图向我解释同样的问题,但我无法理解。他还说pthread_cancel仅是取消线程的请求,可能不会成功。
因此,有人能指出潜在的错误和避免相同情况的最佳实践吗?如果需要更改以确保程序的工作,也将不胜感激。
volatile
标志为0。主线程将stdin
(0)fd设置为非阻塞模式,并继续尝试读取(适当的睡眠时间为10毫秒)。每次重复之前都要检查易失性变量。这样您就可以获得相同的行为。 - Ajay Brahmakshatriyadup
复制fd,然后在其上进行读取。如果将0 fd 设置为非阻塞模式,我不确定标准库代码(例如scanf、gets)会如何行事。 - Ajay Brahmakshatriya