Centos中的pthread C ++没有运行

时间:2016-01-29 10:05:21

标签: c++ pthreads

这是我的代码:

void* task1(void* unused)
{
    try {               
      cout << "Run Thread" << endl;     
    }catch (const char* msg) {
      cout << msg << endl;
    }    
}

int main(int argc, char *argv[])
{   
    try {
      pthread_t thread_id;    
      int res = pthread_create(&thread_id, NULL, &task1, NULL);
      cout << res << std::endl;   
      exit(EXIT_SUCCESS);      
    }catch (const char* msg) {
      cout << msg << endl;
    }

}
  • 在Ubuntu Code RUN中。
  • 在CentOS代码中不运行,如果我运行了pthread_join(thread_id, NULL);代码,但可以等待pthread完成。我尝试pthread_tryjoin_np但代码没有运行。
  • 请帮助我在centos中运行代码是不行的

2 个答案:

答案 0 :(得分:3)

如果程序main()在线程实际启动之前退出(并且运行到点cout << ...),则线程将被终止而不会继续运行。

即。您需要在pthread_join()退出前main()等待。

Ubuntu中的情况纯属巧合,线程设法在main()退出后由C ++运行时终止之前打印该行。

如果您不想等待,因为您想要启动多个线程,则可以使用线程池(线程数组)。首先,你开始所有这些,然后你pthread_join()等待所有这些完成。

此外,如果pthread_join()阻塞虽然线程已终止,但请确保将该线程创建为可连接。这是默认值,因此请确保未将线程属性显式设置为PTHREAD_CREATE_DETACHED

绝对确定,您可以显式提供线程创建属性,并确保将线程创建为可连接:

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&thread_id, &attr, &task1, NULL);
pthread_attr_destroy(&attr);
pthread_join(thread_id, NULL);

(不包括错误处理)

答案 1 :(得分:1)

为什么不使用C ++ 11?标准库(STL)有机会使用线程开发跨平台应用程序。您可以在cpp.sh

上进行测试
#include <iostream>
#include <thread>

void task1(int used)
{
    std::cout << "Run Thread " << used << std::endl;
}

int main() 
{
    std::thread thr(task1,1);
    thr.join();
    return 0;
}

OR

#include <iostream>
#include <thread>
#include <chrono>

bool bThread = false;
void task1(int used)
{
    std::cout << "Run Thread " << used << std::endl;
    bThread = true;
}

int main() 
{
    std::thread thr(task1,1);
    try
    {
        thr.detach();
        while (!bThread) std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
    catch(...) { return 1; }

  return 0;
}