我基本上刚刚发现存在多线程编程,并且我在盲目地尝试这个概念的过程中很有趣。
我想做的是一个计时器,该计时器每秒动态检查一次,而用户则以某种形式与程序进行交互。
这是我到目前为止所能完成的:
void* timer (void* threadToStop)
{
pthread_t* threadName = threadToStop;
time_t startTime = time(NULL);
time_t currentTime;
int elapsedTime;
int remainingTime;
do {
if (currentTime != time(NULL))
{
currentTime = time(NULL);
elapsedTime = currentTime - startTime;
remainingTime = 10 - elapsedTime;
printf("%d ", remainingTime);
fflush(stdout);
}
} while (remainingTime > 0);
pthread_cancel(*threadName);
return NULL;
}
void* func (void* vargp)
{
getchar();
return NULL;
}
int main(void)
{
pthread_t funcId;
pthread_create(&funcId, NULL, func, NULL);
pthread_t timerId;
pthread_create(&timerId, NULL, timer, &funcId);
pthread_join(funcId, NULL);
return EXIT_SUCCESS;
}
从两个不同的函数创建两个线程,并开始同时运行。
“ func
”只是一个虚拟功能,要求用户输入字符。这只是在计时器在后台运行时让用户与程序进行交互的一种方式。
“ timer
”是不言而喻的:它是每秒启动和更新计时器的函数。创建此线程时,还将获得func
的线程ID作为参数。时间到时,我调用pthread_cancel
函数以使用其ID停止func
的线程。
该程序在大多数情况下都起作用:在控制台中输入字符时,计时器保持运行,当我按Enter键时,pthread_join
函数将启动,主函数到达末尾。但是,当计时器用尽时,func
线程不会被取消,而我很难找出原因。
答案 0 :(得分:1)
在使用之前,代码未初始化currentTime
:
time_t currentTime;
int elapsedTime;
int remainingTime;
do {
if (currentTime != time(NULL))
仅当通过或“坐在”所谓的“取消点” 时,线程才会被取消。
getchar()
不一定是取消点。
POSIX线程的强制和可选取消点列表为here。
要了解替换实际发生的情况:
pthread_cancel(...);
作者:
errno = pthread_cancel(...);
if (0 != errno)
{
perror("pthread_cancel() failed");
}