我有一个我想在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传递的任何内容吗?
答案 0 :(得分:1)
内存由所有线程共享,因此如果您在一个线程中更改arg->info->signal
,则所有线程都会看到更改。
但是,访问此类共享资源时,请务必使用互斥锁或读写锁保护它。这可以防止它被两个线程同时修改,并且还强制执行内存屏障以确保不重新排序其他写入(这会导致其他线程看不到它们。)
答案 1 :(得分:0)
我担心你的例子没有多大意义(没有pthread_create
- 这意味着最后一行),我并不完全理解你的问题。 arg
本身与信号无关。
但是,我可以告诉你arg
参数。它包含一个不透明的指针。 opaque的含义是只有你的代码会查看它。 pthread_create
会将其作为第三个参数(start_routine
)传递给您传递的函数。它是否重要仅取决于你使用它的目的。