gpt4 book ai didi

c - linux 中 pthread_create 中的 'arg'

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:38 25 4
gpt4 key购买 nike

我有一个要传递给 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 和信号。当共享信号发生变化时,我只希望它处理一个任务例程。

那么我的问题是:

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

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

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

最佳答案

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

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

关于c - linux 中 pthread_create 中的 'arg',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21243666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com