Я пишу программу с потребительским потоком и потоком производителя, теперь кажется, что синхронизация в очереди - это большие накладные расходы в программе, и я искал некоторые варианты реализации без блокировки, но только нашел версию Lamport и улучшенную версию на PPoPP '08:
enqueue_nonblock(data) {
if (NULL != buffer[head]) {
return EWOULDBLOCK;
}
buffer[head] = data;
head = NEXT(head);
return 0;
}
dequeue_nonblock(data) {
data = buffer[tail];
if (NULL == data) {
return EWOULDBLOCK;
}
buffer[tail] = NULL;
tail = NEXT(tail);
return 0;
}
Обе версии требуют предварительно выделенного массива для данных, мой вопрос в том, есть ли какая-либо однопользовательская реализация без блокировки без блокировки, которая использует malloc() для динамического распределения пространства?
И еще один связанный с этим вопрос: как я могу измерить точные накладные расходы в синхронизации очередей? Например, сколько времени занимает pthread_mutex_lock() и т.д.