Модификация потоковых данных извне потока - PullRequest
0 голосов
/ 13 апреля 2011

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

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

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

Куда относятся эти функции?

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

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

0 голосов
/ 13 апреля 2011

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

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

...