Изменение данных потоков извне потока

#c #multithreading #posix

#c #многопоточность #posix

Вопрос:

Как можно изменить данные потоков извне потока?

Если поток выполняет функцию, которая выполняет цикл для среды выполнения приложения, как можно установить, изменить его данные?

Как вызывать функции, которые изменяют определенные функции потоков?

К чему относятся эти функции?

Ответ №1:

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

Ответ №2:

Если «данные потока», которые вы хотите изменить извне, находятся в форме локальных переменных в функции, запущенной в потоке, или данных, специфичных для потока, созданных с __thread расширением, то единственный способ, которым вы можете изменить их извне (код по модулю с UB, который технически просто уничтожает память), — это заставить поток взять адреса своих переменных и сохранить их где-нибудь, где другие потоки могут их видеть (либо в глобальной переменной, либо в местоположении, переданном через void * аргумент функции запуска потока.

Также обратите внимание, что, как указывал rerun, вы должны использовать какой-либо метод синхронизации, если несколько потоков обращаются к одним и тем же данным. Единственными стандартными / переносимыми методами синхронизации являются методы pthread: pthread_mutex_lock и т.д., Но вы также можете использовать встроенную сборку или компилятор (например, __sync_* в gcc).

Комментарии:

1. Что, если нет другого потока или функции, изменяющей те же данные. Я просто хочу изменить некоторые данные, которые выполняются в потоке. Будет ли нормально просто изменить, например, указатель, который объявлен вне потоковой функции, и просто изменить его также вне потока. Поток прочитает указанные данные, и обновление пройдет нормально?

2. Если один поток считывает память, измененную другим потоком, без промежуточного примитива синхронизации pthread, результатом является неопределенное поведение в соответствии с POSIX. Практически, это не вызовет у вас назальных демонов, но это означает, что нет никакой гарантии относительно того, «увидит» ли ваш поток изменения, внесенные другим потоком. На x86 и x86_64 вы увидите изменение, если только компилятор не увидит, что переменная не может быть законно изменена и оптимизирована путем ее перезагрузки ( volatile это исправило бы это). Однако в других archs могут потребоваться специальные барьеры памяти.