从包装函数调用时,pthread_create不执行任何操作

时间:2013-04-04 11:54:07

标签: c++ pthreads

我正在尝试实现这样的线程对象:

#include <pthread.h>
#include <iostream>

class Thread
{
private:
    int id;
    static void * run(void * arg)
    {
        int tid = (int)arg;
        std::cout << "Thread " << tid << " executed." <<std::endl;
        pthread_exit(NULL);
    }
public: 
    Thread(int _id);
    void start();
    int get_id();
};

这是公共方法和实施方法的实施。构造:

#include "std_thread.h"

Thread::Thread(int _id)
{
    id = _id;
}

void Thread::start()
{
    std::cout << "Thread created." <<std::endl;
    pthread_t thread;
    int rc = pthread_create(&thread, NULL, run, (void*)id);
    if(rc) 
        std::cout << "Return code from thread is " << rc;
}

int Thread::get_id()
{
    return id;
}

这是主要的:

#include "std_thread.h"

int main()
{
    Thread *thd = new Thread(0);
    thd->start();

    return 0;
}

当我创建线程对象并调用其start方法时,该方法又应该打印“Thread created”。并运行线程体 - 它没有;实际上,它确实将创建的Thread打印到控制台,但似乎没有创建一个线程,或者线程只是没有做任何事情。顺便说一下,一切都很好,没有运行时错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的main在线程有机会运行之前返回。

程序不会等到所有线程在退出之前完成 - 一旦main结束,它就结束了,并且该过程刚刚关闭。

pthread_t thread;作为成员而不是局部变量,并添加一个等待线程完成的方法。
这是我能提出的最简单的例子:

void Thread::wait()
{
    pthread_join(thread, NULL);
}

int main()
{
    Thread thd(0); // There's no point in using dynamic allocation here.
    thd.start();
    thd.wait();
    return 0;
}