Алгоритм, который вы показываете, работает, потому что, хотя два потока совместно используют ресурс (то есть очередь), они разделяют его очень особым образом. Поскольку только один поток когда-либо изменяет главный индекс очереди (производитель), и только один поток каждый изменяет хвостовой индекс (потребитель, конечно), вы не можете получить противоречивое состояние общего объекта. Также важно, чтобы производитель поместил фактические данные в перед обновлением индекса головки, и чтобы потребитель считал данные, которые ему нужны до обновления хвостового индекса.
Работает так же хорошо, как б / с, массив довольно статичен; оба потока могут рассчитывать на хранилище для находящихся там элементов. Вы, вероятно, не можете полностью заменить массив, но то, что вы можете сделать, это изменить назначение этого массива.
Т.е. вместо того, чтобы хранить данные в массиве, используйте его для хранения указателей на данные. Затем вы можете выполнять malloc () и free () для элементов данных, передавая ссылки (указатели) на них между вашими потоками через массив.
Кроме того, posix поддерживает чтение наносекундных часов, хотя фактическая точность зависит от системы. Вы можете прочитать эти часы с высоким разрешением до и после и просто вычесть.