ускорение неблокирующих операций чтения-записи для многопоточной программы - PullRequest
1 голос
/ 23 ноября 2011

Я пишу код для обмена данными между потоками с помощью C ++.

Некоторым потокам нужно асинхронно читать или записывать некоторую структуру данных.

Например, у нас есть нить 1 и нить 2.

Когда поток 1 должен получить некоторые данные из потока 2, если данные все еще недоступны для потока 1, он не должен быть заблокирован и может выполнять другие действия, а затем вернуться к проверке данных позже.

То же самое относится к теме 2.

Каковы процедуры API расширенной неблокирующей записи чтения, которая может это сделать?

Я не могу найти его в ускоренном документе.

Я нашел что-то для соляриса здесь:

http://www.shrubbery.net/solaris9ab/SUNWdev/MTP/p31.html

Мне нужны подпрограммы API, которые могут поддерживать:

(1) сначала опубликуйте процедуру чтения-записи (2) делать другие вещи (3) затем вернитесь, чтобы проверить, были ли данные доступны или нет

спасибо

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Каковы процедуры API расширенной неблокирующей записи чтения, которая может это сделать?

Кто говорит, что они есть? Как правило, это зависит от вас, чтобы создать функциональность более высокого уровня, как это. Boost.Thread - для создания потоков и управления синхронной связью между ними.

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

0 голосов
/ 23 ноября 2011

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

Если вы читаете из файловых дескрипторов, сделайте их неблокирующими.Чтение из них вернуло бы ошибку EAGAIN или EWOULDBLOCK.

Edit Как сказал другой автор, вы всегда можете использовать mutex .Попытайтесь заблокировать мьютекс, и, если это не удалось, продолжайте выполнять другую работу.

Редактировать 2 Если размер контейнера является статическим, то вам нужны другие сигналы или связь между потоками.,Вспоминаются мьютексы / условные переменные или добавление флага к контейнеру, который говорит, что он был изменен.Флаг в контейнере работает, только если есть один читатель контейнера, так как читатель должен очистить флаг, когда закончите.

...