线程意外结束。 C ++

时间:2014-05-24 21:03:56

标签: c++ multithreading pointers pthreads sleep

我试图抓住pthreads。我看到有些人也有意想不到的pthread行为,但似乎没有一个问题得到解答。

以下代码应该创建两个线程,一个依赖于另一个。我读到每个线程都会在它们的堆栈中创建变量(不能在线程之间共享),并且使用全局指针是一种让线程共享一个值的方法。一个线程应该打印它的当前迭代,而另一个线程睡眠10秒。最终人们会期待10次迭代。使用断点,似乎脚本在

处死掉
while (*pointham != "cheese"){

也可能是我没有正确使用代码块调试功能。任何指针(har har har)都会有所帮助。

#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>
#include <string>

using namespace std;
string hamburger = "null";
string * pointham = &hamburger;

void *wait(void *)
{
    int i {0};
    while (*pointham != "cheese"){
        sleep (1);
        i++;
        cout << "Waiting on that cheese " << i;
    }
    pthread_exit(NULL);
}

void *cheese(void *)
{
    cout << "Bout to sleep then get that cheese";
    sleep (10);
    *pointham = "cheese";
    pthread_exit(NULL);
}

int main()
{

   pthread_t threads[2];
   pthread_create(&threads[0], NULL, cheese, NULL);
   pthread_create(&threads[1], NULL, wait, NULL);

   return 0;
}

3 个答案:

答案 0 :(得分:1)

问题是你启动你的线程,然后退出进程(从而杀死你的线程)。您必须等待线程退出,最好使用pthread_join函数。

答案 1 :(得分:0)

如果您不想加入所有线程,可以在 main 线程中调用pthread_exit(),而不是从main()返回。

但请注意手册页中的BUGS部分:

   Currently, there are limitations in the kernel implementation logic for
   wait(2)ing on a stopped thread group with a dead thread  group  leader.
   This  can manifest in problems such as a locked terminal if a stop sig‐
   nal is sent to a foreground  process  whose  thread  group  leader  has
   already called pthread_exit().

答案 2 :(得分:0)

根据此tutorial

  

如果main()在其创建的线程之前完成,并以pthread_exit()退出,则其他线程将继续执行。否则,它们将在main()完成时自动终止。

因此,您不应使用语句main结束return 0;函数。但是您应该改用pthread_exit(NULL);

如果这对您不起作用,则可能需要了解有关加入线程here的信息。