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

时间:2012-01-27 19:58:44

标签: c multithreading global-variables

这是我的结构:

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的值复制到其中?我需要它,如果我修改本地结构的字段,那将在其他线程中看不到。我见过其他类似的问题,但我没有找到答案......

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果要为每个线程创建一个干净的非共享副本,则在将副本传递给线程之前,要进行复制的位置。这避免了需要锁定数据的问题。

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

现在这是重要的部分。主线程不应该再次触摸该副本。线程在使用数据完成后应调用free

是的,这意味着你仍然有一个指向结构的指针而不是线程堆栈上的结构。但是,请想一想:堆栈上的结构对您有什么影响?您必须输入->而不是.,这就是它。

当然,如果您使用无锁每线程池或NUMA进行内存分配,我的建议会变得更加复杂并产生异常和问题。在这些情况下,您可能确实希望在线程中创建副本。需要锁定主数据,线程需要复制然后解锁数据源。

在一些激动人心的情况下,您可能需要三个副本:主副本(主内存),临时副本(主内存但不需要锁定主副本)和线程内副本(现在在每线程内存中,也是没有锁)。