线程如何与“pthread_create”时传递的“启动例程”函数一起工作?

问题描述 投票:0回答:1

我刚刚开始使用 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$ 的运行。首先让我分享一下我对另一次跑步的理解。

  • 在运行 1$2$4$ 时,主线程在创建的线程结束后结束,导致
    start routine
    (本例中的函数
    th_func
    )在程序结束之前执行。
  • 在运行时5$,但是主线程在创建的线程之前结束,这导致创建的线程在给它处理的代码之前终止。 (
    th_func
    不打印
    cout
    声明)

让我来谈谈3$,它吸引了我所有的注意力,或者可能停留在我的脑海里。我的问题是:

  1. 为什么创建的线程在打印
    cout
    语句上的内容并返回
    NULL
    后没有终止? (正如 pthread_create 的手册页中第 2 节所建议的那样:
描述顶部 pthread_create() 函数在调用中启动一个新线程 过程。 新线程通过调用开始执行 开始例程(); arg 作为唯一参数传递 开始例程()。

新线程以下列方式之一终止:

它调用 pthread_exit(3),指定退出状态值 可用于同一进程中调用的另一个线程 pthread_join(3).

它从start_routine()返回。 这相当于 使用返回中提供的值调用 pthread_exit(3) 声明。

它被取消(参见 pthread_cancel(3))。

进程中的任何线程调用 exit(3),或者主线程 线程执行从 main() 返回。 这导致 终止进程中的所有线程。

如果返回,为什么要打印
    cout
  1. (
    cout << "Indside Thread Start Routine !!\n";
    ) 语句两次?线程创建了两次吗?
    
    
  2. 我在互联网上研究了几个小时,但老实说找不到答案。也许我的代码不是线程安全的或 idk ?我只是认为可能是
pthread_join

帮助,但它仍然只是等待创建的线程被终止,这对我的问题没有帮助(打印两次或者可能调用

th_func
两次)。所以我希望有人能帮忙......
预先感谢:)

c++ linux thread-safety pthreads
1个回答
0
投票
std::cout

)是从两个不同的线程操作的,而没有任何同步尝试。主线程正在销毁

std::cout
,而创建的线程则尝试将其用于输出。这是数据竞赛。任何事都有可能发生。
使用 

std::thread

也可以实现同样的效果。

加入线程应该可以解决问题。 

std::jthread

会自动为您执行连接,因此这是在 C++ 中执行线程的首选方法。

    

© www.soinside.com 2019 - 2024. All rights reserved.