Потоковая безопасность UuidCreateSequential и p / invoke вызовов в целом - PullRequest
0 голосов
/ 02 октября 2009

Я работаю с системой, которая использует GUID в качестве ключей в большинстве таблиц базы данных. Руководства создаются с использованием UuidCreateSequential , чтобы соответствовать индексам базы данных.

C ++ синтаксис, в соответствии с http://msdn.microsoft.com/en-us/library/aa379322(VS.85).aspx:

RPC_STATUS RPC_ENTRY UuidCreateSequential(
    UUID __RPC_FAR *Uuid
);

p / invoke.net предлагает следующую подпись:

[DllImport("rpcrt4.dll", SetLastError=true)]
static extern int UuidCreateSequential(out Guid guid);

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

1 Ответ

1 голос
/ 02 октября 2009

Обычно можно предположить, что большая часть Windows API является поточно-ориентированной.

Глобальный уникальный идентификатор должен быть в любое время создан из любого приложения в системе. Поэтому я бы сказал, что безопасность потока является обязательной функцией генератора GUID. RFC 4122 описывает метод генерации идентификаторов GUID, который должен быть достаточно близок к тому, что на самом деле делает Windows. Обратите внимание, что в нем упоминается получение глобальной блокировки, которая была бы необходима для обеспечения того, чтобы одновременные вызовы для создания GUID не могли получить одно и то же значение.

...