Как скопировать структуру в локальную структуру потока - PullRequest
0 голосов
/ 27 января 2012

Это моя структура:

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 в каждом потоке и скопировать в него структуру и значения аргументов? Это нужно мне так, что если я изменю поле локальной структуры, это не будет видно в других потоках. Я видел другие подобные вопросы, но я не нашел свой ответ ...

Ответы [ 2 ]

2 голосов
/ 28 января 2012

В C вы можете назначать объекты типа структуры:

struct example *extmp = args; 
struct example local_copy = *extmp;
1 голос
/ 28 января 2012

Если вам нужна чистая неразделенная копия для каждого потока, место, где нужно сделать копию, прежде чем передать ее потоку.Это позволяет избежать проблем с необходимостью блокировки данных.

В вашем случае функция main должна распределять другую структуру, тогда вы можете использовать memcpy или *new_data = *old_data для копирования данных.Затем вы передаете указатель в поток.

Теперь это важная часть.Основной поток никогда не должен касаться этой копии снова .Поток должен вызвать free, когда это будет сделано с использованием данных.

Да, это означает, что у вас все еще есть указатель на структуру, а не структуру в стеке потока.Однако подумайте: что дает вам структура в стеке?Вы должны набрать -> вместо . и это все.

Конечно, мой совет становится намного более сложным и разрабатывает исключения и сценарии, если вы выполняете выделение памяти с безблокировочнойПулы потоков или NUMA.В этих случаях вы, вероятно, захотите сделать копию внутри потока.Основные данные должны быть заблокированы, а поток должен будет сделать свою копию, а затем разблокировать источник данных.

В некоторых случаях может потребоваться три копии: основная копия (основная память), временная копия(основная память, но не нужно блокировать первичную) и копию в потоке (теперь в памяти для каждого потока, также нет блокировок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...