我刚刚开始使用 pthreads 库了解线程如何在 Linux(Ubuntu)上真正工作。我陷入了第一个程序。先看代码:
#include <pthread.h>
#include <iostream>
using namespace std;
void* th_func(void* arg) {
cout << "Indside Thread Start Routine !!\n";
return NULL;
}
void foo() { cout << "Inside Foo !!\n"; }
int main(void) {
int ret;
foo();
pthread_t thread;
if (!(ret = pthread_create(&thread, NULL, th_func, NULL))) {
cout << "ret = " << ret << endl;
}
return 0;
}
这里程序的简单编译和测试运行:(我故意在
$
之前使用0,1,...只是为了索引并试图更有效地解释)
0$ g++ t0.cpp
1$ ./a.out
Inside Foo !!
ret = 0
Indside Thread Start Routine !!
2$ ./a.out
Inside Foo !!
ret = 0
Indside Thread Start Routine !!
3$ ./a.out
Inside Foo !!
ret = 0
Indside Thread Start Routine !!
Indside Thread Start Routine !!
4$ ./a.out
Inside Foo !!
ret = 0
Indside Thread Start Routine !!
5$ ./a.out
Inside Foo !!
ret = 0
我对所有测试运行都很满意,除了索引为 3$ 的运行。首先让我分享一下我对另一次跑步的理解。
start routine
(本例中的函数 th_func
)在程序结束之前执行。th_func
不打印cout
声明)让我来谈谈3$,它吸引了我所有的注意力,或者可能停留在我的脑海里。我的问题是:
如果返回,为什么要打印新线程以下列方式之一终止:
它调用 pthread_exit(3),指定退出状态值 可用于同一进程中调用的另一个线程 pthread_join(3).
它从start_routine()返回。 这相当于 使用返回中提供的值调用 pthread_exit(3) 声明。
它被取消(参见 pthread_cancel(3))。
进程中的任何线程调用 exit(3),或者主线程 线程执行从 main() 返回。 这导致 终止进程中的所有线程。
cout
cout << "Indside Thread Start Routine !!\n";
) 语句两次?线程创建了两次吗?
pthread_join
帮助,但它仍然只是等待创建的线程被终止,这对我的问题没有帮助(打印两次或者可能调用
th_func
两次)。所以我希望有人能帮忙......预先感谢:)
std::cout
)是从两个不同的线程操作的,而没有任何同步尝试。主线程正在销毁
std::cout
,而创建的线程则尝试将其用于输出。这是数据竞赛。任何事都有可能发生。使用 std::thread
也可以实现同样的效果。
加入线程应该可以解决问题。std::jthread
会自动为您执行连接,因此这是在 C++ 中执行线程的首选方法。