2016-02-14 5 views
0

У меня есть два потока (основной и фон), они могут общаться через пару гнезд. Основной поток ожидает чтения из сокета. Фоновый поток загружает и обрабатывает файл, затем он должен отправлять эти данные в основной поток.Является ли эта модель безопасной с pthreads?

Это хорошая идея, чтобы отправить только указатель из фоновой нити через сокет? Могу ли я быть уверенным, что все данные будут в правильном состоянии, как только я получу указатель на него в основном потоке?

Я спрашиваю об этом, потому что мне интересно, могут ли быть проблемы с кэшированием памяти в процессоре, поскольку фоновый поток может работать на другом ядре.

Я работаю над iOS и OS X, и я могу интегрировать ожидание сокета в цикл запуска (используя CFSocket).

Я знаю, что использование GCD может быть лучше, но я хочу узнать pthreads.

+0

Почему вы используете потоки, а не процессы, когда вы делитесь данными явно, отправив их через сокет? Если вы используете потоки, разделяемая память - естественный способ общения. – EOF

+0

@EOF Это все из-за приложений iOS, у всех из них есть цикл запуска в основном потоке. Этот цикл цикла может быть настроен на ожидание сокета, а также возможность получать уведомления о взаимодействиях пользовательского интерфейса. Ожидание мьютекса не может быть сконфигурировано таким образом. – Beirs

ответ

0

read() и write() не включены в список POSIX "functions that synchronize memory", поэтому технически это не гарантируется работой POSIX.

Вам понадобится функция синхронизации POSIX - например, pthread_barrier_wait() может быть уместным здесь (функция отправки выполняет барьер после хранения данных и публикации указателя, функция приема выполняет барьер перед чтением данных).

Смежные вопросы