gpt4 book ai didi

c - 如何让一个线程停止另一个线程?

转载 作者:行者123 更新时间:2023-11-30 14:39:24 24 4
gpt4 key购买 nike

我基本上刚刚发现多线程编程的存在,并且我很享受盲目地尝试这个概念。

我想做的是一个每秒动态检查一次的计时器,同时用户继续以某种形式与程序交互。

这是我到目前为止能够完成的事情:

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”只是一个虚拟函数,要求用户输入一个字符。这只是计时器在后台运行时让用户与程序交互的一种方式。

计时器”是不言自明的:它是每秒启动和更新计时器的函数。创建此线程时,它还会获取 func 的线程 id 作为参数。时间到了,我调用 pthread_cancel 函数,以使用其 id 停止 func 的线程。

该程序大部分情况下都有效:当我能够在控制台中输入字符时,计时器保持运行,当我按下 Enter 键时,pthread_join 函数将启动并执行 main 函数到达终点。但是,当计时器耗尽时,func 线程不会被取消,我很难找出原因。

最佳答案

代码在使用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");
}

关于c - 如何让一个线程停止另一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com