Если вам нужна чистая неразделенная копия для каждого потока, место, где нужно сделать копию, прежде чем передать ее потоку.Это позволяет избежать проблем с необходимостью блокировки данных.
В вашем случае функция main
должна распределять другую структуру, тогда вы можете использовать memcpy
или *new_data = *old_data
для копирования данных.Затем вы передаете указатель в поток.
Теперь это важная часть.Основной поток никогда не должен касаться этой копии снова .Поток должен вызвать free
, когда это будет сделано с использованием данных.
Да, это означает, что у вас все еще есть указатель на структуру, а не структуру в стеке потока.Однако подумайте: что дает вам структура в стеке?Вы должны набрать ->
вместо .
и это все.
Конечно, мой совет становится намного более сложным и разрабатывает исключения и сценарии, если вы выполняете выделение памяти с безблокировочнойПулы потоков или NUMA.В этих случаях вы, вероятно, захотите сделать копию внутри потока.Основные данные должны быть заблокированы, а поток должен будет сделать свою копию, а затем разблокировать источник данных.
В некоторых случаях может потребоваться три копии: основная копия (основная память), временная копия(основная память, но не нужно блокировать первичную) и копию в потоке (теперь в памяти для каждого потока, также нет блокировок).