一个在C中停止另一个的线程

时间:2012-02-29 11:59:30

标签: c++ c pthreads

我有2个帖子。 我的目标是第一个终止自己的执行,必须停止另一个线程。 有可能吗?

我有这段代码:

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>

void* start1(void* arg)
{
  printf("I'm just born 1\n");
  int i = 0;
  for (i = 0;i < 100;i++)
  {
    printf("Thread 1\n");
  }
  printf("I'm dead 1\n");
  pthread_exit(0);
}

void* start2(void* arg)
{
  printf("I'm just born 2\n");
  int i = 0;
  for (i = 0;i < 1000;i++)
  {
    printf("Thread 2\n");
  }
  printf("I'm dead 2\n");
  pthread_exit(0);
}

void* function()
{
  int k = 0;
  int i = 0;
  for (i = 0;i < 50;i++)
  {
    k++;
    printf("I'm an useless function\n");
  }
}   

int main()
{
  pthread_t t, tt;
  int status;
  if (pthread_create(&t, NULL, start1, NULL) != 0)
  {
    printf("Error creating a new thread 1\n");
    exit(1);
  }
  if (pthread_create(&tt, NULL, start2, NULL) != 0)
  {
    printf("Error creating a new thread 2\n");
    exit(1);
  }
  function();
  pthread_join(t, NULL);
  pthread_join(tt, NULL);
  return 0;
}

例如,第一个线程必须停止第二个线程。 怎么可能这样做?

4 个答案:

答案 0 :(得分:10)

通常强制线程终止并不好。终止另一个线程的简洁方法是设置一个标志(两个线程都可见),告诉线程自行终止(通过立即返回/退出)。

答案 1 :(得分:0)

这听起来像是非常复杂(糟糕)的设计。通常你会有一个主人(控制者),它会有孩子。

如果你必须采用这种方法,我会让第一个线程产生第二个,然后第二个产生thrid(这样它“拥有”那个线程)。

最后,如果你必须这样做,你可以通过它的void *参数将线程传递给第一个worker。

此外,您不需要显式退出线程,只需让它“运行”然后加入它。

答案 2 :(得分:0)

将2个线程作为参数传递给另一个线程的线程id。而不是在完成他的工作的第一个中调用pthread_kill(other_thread_id, SIGKILL)。我假设你知道你在做什么(你已经被警告过这是不好的做法)。

答案 3 :(得分:0)

请参阅方法pthread_cancel()取消(结束)一个帖子。