这是我的代码:
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;
}
}
pthread_join(thread_id, NULL);
代码,但可以等待pthread
完成。我尝试pthread_tryjoin_np
但代码没有运行。答案 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;
}