linux中的pthread_create中的'arg'

时间:2014-01-20 20:36:39

标签: c linux pthreads

我有一个我想在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]);

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

然后我的问题是:

为了检查信号是否改变,arg是否传入pthread函数问题? 如果信号在另一个索引中被改变为ex [3], 这将在任务线程中检查还是根本不被识别?

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

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

2 个答案:

答案 0 :(得分:1)

内存由所有线程共享,因此如果您在一个线程中更改arg->info->signal,则所有线程都会看到更改。

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

答案 1 :(得分:0)

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

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