C 结构中的线程本地存储

C 结构中的线程本地存储,c,gcc,C,Gcc,我想在即将到来的项目中使用c语言,在尝试一些我需要的概念时,我遇到了以下问题。假设我有这样一个结构: struct SomeStruct { int fixedValue; int changingValue; }; 在main中,我将把这个结构的一个实例malloc到一个全局指针中,并填充fixedValue成员。然后将有多个线程读取该fixedValue并更改changingValue。因此,changingValue对于每个线程都应该是独占的,即每个线程都有自己的。理

我想在即将到来的项目中使用c语言,在尝试一些我需要的概念时,我遇到了以下问题。假设我有这样一个结构:

struct SomeStruct
{
    int fixedValue;
    int changingValue;  
};
在main中,我将把这个结构的一个实例malloc到一个全局指针中,并填充fixedValue成员。然后将有多个线程读取该fixedValue并更改changingValue。因此,changingValue对于每个线程都应该是独占的,即每个线程都有自己的。理想情况下,我正在寻找类似于_线程的东西,可以让我做到这一点。当然,我可以将changingValue更改为数组,但这会使代码更加混乱。因此,我想知道是否有更优雅的解决方案


谢谢大家!

你的要求是不可能的,因为你的要求是自相矛盾的。您不能使用
malloc
分配足够大的内存块来存储两个
int
,还可以分配足够的内存来存储任意数量的
int
对象,使用相同的
malloc

对象的所有子对象O都具有与O相同的存储类(如果有的话)。因此,如果对象O1和O2都是同一对象的子对象,则它们彼此具有相同的存储类。C不允许结构或联合成员声明带有存储类说明符(
静态的
外部的
自动的
线程的
本地的等等),这一事实反映了这一点。相反,C17表示:

如果使用存储类说明符而不是
typedef
,由存储类说明符生成的属性, 除与联系有关外,也适用于 对象,依此类推 对象

(C2017,6.7.1/8)

你说

大体上,我将把这个结构的一个实例malloc到一个全局指针中

,但这并不能同时提供线程之间共享的一个对象和多个不同的每线程对象。此外,还不清楚为什么要分配一个对象,而不是直接声明一个对象


如果线程必须共享
fixedValue
并具有自己的
changingValue
s,那么这些线程就不能有效地成为同一结构的成员。你需要把它们分开。此外,尽管C从C11开始就内置了对线程本地存储的支持,但使用其他机制来提供每个线程的数据(例如线程函数的本地变量)通常更容易、更好。

它是哪个?他们都会修改结构,或者每个线程都应该有自己的结构?你们的规格是自相矛盾的。我无法想象把直接线程本地存储作为一个成员作为一个结构。替代方法是将整个内容放在TLS中,或者-可能更好-使用
int*changingValue
作为指向单个线程本地值的指针。@ikegami:将有一个结构,每个线程应该共享一个固定值,但有自己的changingValue他们自己解释得很好:他们想要一个中心的单个结构,所有线程共享
fixedValue
,但每个线程都有自己的
changingValue
。他们解释得很好;问题是他们想要什么是不可能的。嗯,我一直在寻找的基本上是语法糖。当然,您需要占用足够的空间,我只是在寻找一种方式,让编译器为我做到这一点。我可以将changingValue更改为指针,malloc我需要多少空间,并确保线程只访问各自的索引。Re“你需要malloc足够的空间”,没有必要分配比结构使用更多的内存。Re“我一直在寻找的基本上是语法糖”,没有,您特别要求使用的结构太小,无法包含必要的信息。是的,但该结构需要更多的空间,这就是重点。显然,我在寻找能为我做到这一点的东西。这是否可以使用uu-thread这样的修饰符来完成,或者使用一些datastruct ThreadStruct,或者干脆不使用c语言来实现,这是我的问题,没有必要分配比结构使用的内存更多的内存。我需要动态分配它,因为我需要基于用户输入的多个这样的结构。我只是简化了这个例子。想象一下模拟工具或解算器之类的东西。每个结构表示某个对象,fixedValue是某种标识符,changingValue可能是模拟分配给该对象的某种成本。每个线程将在同一个用户提供的实例上工作。主线程解析此实例,将(外部)id设置为固定值,然后创建多个工作线程,尝试找到问题的解决方案,从而将成本分配给其解决方案的changingValue。不同的线程可能会找到不同的解决方案,从而为此对象分配不同的成本。@Gorid,如果您想为每个线程分配一个单独的
changingValue
,那么您需要为每个线程分配一个单独的值。如果您希望主线程以后能够访问所有线程,就像您所做的那样,那么线程本地存储和线程函数的本地变量都不行——主线程需要显式地为每个子线程提供存储。