这是我的结构:
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进行内存分配,会出现异常和漏洞。在这种情况下,您可能确实希望在线程内进行复制。主数据将需要被锁定,线程将需要制作其副本,然后解锁数据源。
在某些令人兴奋的情况下,您可能需要三个副本:主副本(主内存)、临时副本(主存储器,但不需要锁定主存储器)和线程内副本(现在在每个线程的内存中,也没有锁定)。