向 pthread 传递多个参数(包括向量参数)

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

我目前遇到与使用 pthread.h 相关的问题(因为我对它还很陌生),所以我真的希望我能从这个论坛获得一些帮助。假设我想将此函数传递给线程这是用 pthread.h 创建的:

    void test (long int begin, long int end, vector<long int> x)
    {
                    /*do something*/
    }

您知道如何将此函数及其所有参数包含到该线程中吗? 或者我什至可以将其传递到 pthread 中吗??

我可以同时将具有多个参数的多个函数传递到 pthread 中吗? 非常感谢您的任何帮助,thx

c++11 vector pthreads
1个回答
0
投票

假设我想将此函数传递给创建的线程 与 pthread.h :

    void test (long int begin, long int end, vector<long int> x)
    {
                    /*do something*/
    }

那么我们假设你不走运。 pthreads 线程的入口点函数必须具有签名

void *f(void *)

你知道如何将此函数与 它的所有论点?或者我什至可以将其传递到 pthread 中吗??

这是不可能做到的这样。但请参阅下文。

我是否能够传递具有多个参数的多个函数 同时进入pthread?

没有。

但是你不需要这样做。与

std::thread
相比,pthreads 接口有些尴尬,但是单个
void
指针参数足以满足任何参数集合和任何函数序列。只需创建一个包含适当成员的结构/类,并将指针传递给实例(转换为
void *
)。然后线程函数提取数据,并调用所需的任何函数。

例如,

struct thread_args {
    long int begin;
    long int end;
    vector<long int> x;
};

void test (long int begin, long int end, vector<long int> x);
    
void *test_wrapper(void *data) {
    thread_args *args_ptr = static_cast<thread_args *>(data);

    test(args_ptr->begin, args_ptr->end, args_ptr->x);
    // ...

    return nullptr;
}

// ...

    thread_args args{ begin, end, x };
    pthread_t thread_id;
    int result = pthread_create(&thread_id, NULL, test_wrapper, &args);
    
// ...

请注意,确保参数对象的生命周期在线程完成之前不会结束非常重要。这通常是通过在对象超出范围之前加入线程以 RAII 方式完成的,或者通过动态分配对象并赋予线程函数释放它的责任。

确保参数对象不会被意外修改也很重要——例如,使用相同的参数对象在循环中启动多个线程,并修改每个线程的对象。

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