c-如何将结构复制到线程的本地结构中



这是我的结构:

struct example {
    int c=0;
    char buf[10];
}

我在main() 中分配了一个这种类型的结构

...
struct example *ex=malloc(sizeof(*ex));
...

并通过传递到线程

...
pthread_create(&id[i], NULL, t_func, ex);
...

pthread_create被调用到main的子级中。

t_func为:

void *t_func(void* args) {
   struct example *extmp = args;
   ....

如何在每个线程中创建一个本地struct example,并将结构和args的值复制到其中?我需要它,这样,如果我修改本地结构的一个字段,它将不会在其他线程中出现。我看过其他类似的问题,但我还没有找到答案。。。

在C中,您可以分配结构类型的对象:

struct example *extmp = args; 
struct example local_copy = *extmp;

如果您希望每个线程都有一个干净的、非共享的副本,那么在将副本传递给线程之前,就应该进行复制。这避免了需要锁定数据的问题。

在您的情况下,main函数应该malloc另一个结构,然后您可以使用memcpy*new_data = *old_data来复制数据。然后将指针传递到线程中。

现在这是重要的部分。主线程不应再接触该副本。线程应该在使用数据时调用free

是的,这意味着您仍然有一个指向结构的指针,而不是线程堆栈上的结构。然而,想想看:堆栈上的结构会给你带来什么?你必须键入->而不是.,仅此而已

当然,我的建议要复杂得多,如果您使用无锁的每线程池或NUMA进行内存分配,会出现异常和漏洞。在这种情况下,您可能确实希望在线程内进行复制。主数据将需要被锁定,线程将需要制作其副本,然后解锁数据源。

在某些令人兴奋的情况下,您可能需要三个副本:主副本(主内存)、临时副本(主存储器,但不需要锁定主存储器)和线程内副本(现在在每个线程的内存中,也没有锁定)。

相关内容

  • 没有找到相关文章