【问题标题】:C pthread with structC pthread 与结构
【发布时间】:2012-12-13 13:18:11
【问题描述】:

所以我们正在努力应对挑战,我们需要并行化 c++ 代码,以确保它使用多个内核而不是一个内核。我们为此使用了 openmp,它现在运行得更好了。但对于另一部分,我们需要使用 pthread。由于我们对 C++ 非常陌生(实际上这是我们第一次使用它),因此我们很难让线程正常工作。

这是原始代码的简约版本:

int main(int argc, char **argv) {
    ...code ...
    //These 2 functions should be running in parallel
    work_calculation(flights, parameter, alliances);
    play_calculation(flights, parameter, alliances);
    ...code...
}

void work_calculation(vector<Flight>& flights, Parameters& parameters, vector<vector<string> >& alliances)
{
    ... code ...
    do_calculation(flights, parameters, alliances);
    ... code ...
}

void do_calculation(vector<Flight>& flights, Parameters& parameters, 
vector<vector<string> >& alliances)
{
    ...code...
}

为了将 pthread 与具有多个参数的函数一起使用,我们发现我们需要使用结构体。所以我们想出了这个:

int main(int argc, char **argv) {
    ...code ...
    s_param parathread;
parathread.flights = flights;
parathread.parameters = parameters;
parathread.alliances = alliances;
pthread_t play;
pthread_t work;
pthread_create(&play, NULL, work_calculation ,&parathread);
pthread_create(&work, NULL, play_calculation, &parathread);
pthread_join(play, NULL);
pthread_join(work, NULL);
    ...code...
}

typedef struct 
{
    vector<Flight> flights;
    Parameters parameters;
    vector<vector<string> > alliances;
} s_param;

void* work_calculation(void* args)
    {
        ... code ...
        struct s_param *paraThread = (struct s_param*)args;
        do_calculation(paraThread->flights, paraThread->parameters, paraThread->alliances);
        ... code ...
        pthread_exit(NULL);
    }

void do_calculation(vector<Flight>& flights, Parameters& parameters, 
vector<vector<string> >& alliances)
{
    ...code... (same as original)
}

如果我们这样做,我们会得到以下错误:

错误:不允许指向不完整类类型的指针 -> 在我做 paraThread 的任何地方

我们也尝试过在 struct s_pram *paraThread = (struct s_param*)args => 中不使用结构(所以像这样: s_param *paraThread = args; ,但是我们在编译时遇到了这些错误:

标识符 s_param 未定义且 标识符 paraThread 未定义

我们做错了什么?希望有人能帮我们定位问题。

【问题讨论】:

  • 无关,但你考虑过Boost吗?
  • work_calculation 是否具有 s_param 的可见性?即它们是否在与s_param 首先声明的同一源文件中?还是在包含work_calculation 的源文件包含的标头中声明了s_param

标签: c++ pointers struct pthreads


【解决方案1】:

struct 需要先定义,然后在main 中实例化它;你在main之后定义它。

【讨论】:

  • 愚蠢,愚蠢,愚蠢!不是你,迈克,我!我怎么会错过这个相当基本的缺陷呢? +1 用于拾取,尽管您仍然需要正确定义/使用 struct/typedef。
【解决方案2】:

我认为你的问题出在这条线上。

pthread_create(&play, NULL, work_calculation, &parathread);

正确的是这样。

pthread_create(&work, NULL, &work_calculation, &parathread);

将其应用于两个线程。

【讨论】:

    【解决方案3】:

    将typedef struct {} s_param的定义移到文件开头。

    【讨论】:

    • 并删除s_param前面的struct。 typedef 已经包含了它。
    【解决方案4】:

    sn-p:

    typedef struct 
    {
        vector<Flight> flights;
        Parameters parameters;
        vector<vector<string> > alliances;
    } s_param;
    

    创建一个类型s_param,而不是struct s_param。 Mike Seymour 有正确的答案(使用和定义的顺序不正确),但您仍然需要使用structtypedef。我自己更喜欢 typedef,但其他人有其他想法。

    你可以使用:

    typedef struct {
        vector<Flight> flights;
        Parameters parameters;
        vector<vector<string> > alliances;
    } s_param;
    :
    s_param *something;
    

    或:

    struct s_param {
        vector<Flight> flights;
        Parameters parameters;
        vector<vector<string> > alliances;
    };
    :
    struct s_param *something; // I think struct is optional but I still prefer it.
    

    【讨论】:

      【解决方案5】:

      如果您不熟悉线程,我将从更高级别的运行时库开始进行并行化。像 pthread 这样的低级线程库在其最低级别公开了并行性控制。那里代表了并行性的汇编语言。因此,它们提供了最大的灵活性,但在程序员工作、调试时间和维护成本方面的成本很高。

      要开源的 C++ 运行时是 cilk Plus 和 TBB。他们有一个开源网站可供下载。

      www.threadingbuildingblocks.org

      www.cilkplus.org

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        相关资源
        最近更新 更多