Linux pthread переносимость на окнах - PullRequest
1 голос
/ 13 июля 2011

Для определенного проекта я должен использовать инициализатор статического мьютекса в pthread. Однако моя библиотека должна быть переносимой и в Windows.

pthread_mutex_t csapi_mutex = PTHREAD_MUTEX_INITIALIZER;

Имеется ли в Windows соответствующий статический инициализатор.?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

Pthreads-win32 должна обеспечивать очень хорошую поддержку таких конструкций.Но я не проверял.

1 голос
/ 22 сентября 2011

Я придумал этот порт pthread-совместимых операций мьютекса:

#define MUTEX_TYPE             HANDLE
#define MUTEX_INITIALIZER      NULL
#define MUTEX_SETUP(x)         (x) = CreateMutex(NULL, FALSE, NULL)
#define MUTEX_CLEANUP(x)       (CloseHandle(x) == 0)
#define MUTEX_LOCK(x)          emulate_pthread_mutex_lock(&(x))
#define MUTEX_UNLOCK(x)        (ReleaseMutex(x) == 0)

int emulate_pthread_mutex_lock(volatile MUTEX_TYPE *mx)
{ if (*mx == NULL) /* static initializer? */
  { HANDLE p = CreateMutex(NULL, FALSE, NULL);
    if (InterlockedCompareExchangePointer((PVOID*)mx, (PVOID)p, NULL) != NULL)
      CloseHandle(p);
  }
  return WaitForSingleObject(*mx, INFINITE) == WAIT_FAILED;
}

По сути, вы хотите, чтобы инициализация происходила атомарно, когда блокировка используется в первый раз. Если два потока входят в if-тело, то только одному удастся инициализировать блокировку. Обратите внимание, что нет необходимости в CloseHandle () для времени жизни статической блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...