【问题标题】:'arg' in pthread_create in linuxlinux中pthread_create中的'arg'
【发布时间】:2014-01-20 20:36:39
【问题描述】:

我有一个结构要传入 pthread_create 函数

例如

typedef struct INFO
{
    int signal;
    int group_id;
}info_type;

struct ARG
{
    info_type *info;
    int id;
};

int i;
static info_type info; //skipped how name and signal is initialized
struct ARG args[5];
for ( i = 0; i < 5; ++i)
{
    args[i]->info = info;
    id = i;
}

然后,我正在尝试创建一个将 ARG 指针作为 'arg' 的线程

启动例程就像

void task(struct ARG * arg)
{
    while(arg->info->signal)
    {
        wait(arg->info->signal); // this part is just pseudo code (just waiting for sig)
    }

    // do some works
}

//this is pseudo code and assume pthread and attr are defined somewhere else 
pthread(pthread, attr, task, &arg[0]);

所以,有多个参数,但只共享一个 info_type、相同的 group_id 和信号。 当共享信号发生变化时,我只希望它处理一个任务例程。

那么我的问题是:

传递给 pthread 函数的 arg 是否重要以检查信号是否已更改? 如果信号在 ex arg[3] 的另一个索引中更改, 这会在任务线程中检查还是根本无法识别?

因为每个 ARG 中的 'id' 都是必需的。那么如果 args[3] 改变了信号(arg[3] id necssary),这个任务会使用 arg[3] 吗?

或者它会使用我调用 pthread_create 函数时传递的任何 arg 参数吗?

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

    内存由所有线程共享,所以如果你在一个线程中更改arg-&gt;info-&gt;signal,所有线程都会看到更改。

    但是,当访问此类共享资源时,请务必使用互斥锁或读写锁对其进行保护。这可以防止它同时被两个线程修改,并且还强制执行内存屏障以确保其他写入不会被重新排序(这将导致它们仍然不被其他线程看到)。

    【讨论】:

      【解决方案2】:

      恐怕你的例子没有多大意义(没有pthread_create - 这意味着是最后一行),我不完全理解你的问题。 arg 本身与信号无关。

      不过,我可以告诉你arg 参数。它包含一个不透明的指针。 opaque 的意思是只有你的代码会看到它。 pthread_create 将简单地将其传递给您作为第三个参数 (start_routine) 传递的函数。是否重要完全取决于您使用它的目的。

      【讨论】:

        猜你喜欢
        • 2013-01-13
        • 2010-11-24
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        相关资源
        最近更新 更多