如何使一个线程停止另一个线程?

时间:2019-05-12 17:27:42

标签: c multithreading pthreads

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

我想做的是一个计时器,该计时器每秒动态检查一次,而用户则以某种形式与程序进行交互。

这是我到目前为止所能完成的:

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线程不会被取消,而我很难找出原因。

1 个答案:

答案 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");
  }