LINUX.ORG.RU

Использовать rwlock из posix-threads и надеяться, что не придется запускать код там, где pthreads нет.

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

Вот я тут попробовал реализовать rwlock, почитайте, покритикуйте.

omp-ext.h:

#ifndef _OMP_EXT_H_
#define _OMP_EXT_H_

#include <assert.h>
#include <omp.h>


typedef struct
{
	omp_lock_t lock;
	unsigned readers;
} omp_rwlock_t;


void  omp_init_rwlock (omp_rwlock_t *);
void  omp_destroy_rwlock (omp_rwlock_t *);
void  omp_set_rlock (omp_rwlock_t *);
void  omp_set_wlock (omp_rwlock_t *);
void  omp_unset_rlock (omp_rwlock_t *);
void  omp_unset_wlock (omp_rwlock_t *);
int   omp_test_rlock (omp_rwlock_t *);
int   omp_test_wlock (omp_rwlock_t *);


#endif //_OMP_EXT_H_

omp-ext.c:

#include "omp-ext.h"


void omp_init_rwlock(omp_rwlock_t *lock)
{
	omp_init_lock(&lock->lock);
	lock->readers = 0;
}


void omp_destroy_rwlock(omp_rwlock_t *lock)
{
	omp_destroy_lock(&lock->lock);
}


void omp_set_rlock(omp_rwlock_t *lock)
{
#pragma omp critical(__omp_rwlock__)
{
	if(lock->readers == 0)
		omp_set_lock(&lock->lock);
	lock->readers++;
}
}


void omp_set_wlock(omp_rwlock_t *lock)
{
	omp_set_lock(&lock->lock);
	assert(lock->readers == 0);
}


void omp_unset_rlock(omp_rwlock_t *lock)
{
#pragma omp critical(__omp_rwlock__)
{
	assert(lock->readers > 0);
	lock->readers--;
	if(lock->readers == 0)
		omp_unset_lock(&lock->lock);
}
}


void omp_unset_wlock(omp_rwlock_t *lock)
{
	assert(lock->readers == 0);
	omp_unset_lock(&lock->lock);	
}


int omp_test_rlock(omp_rwlock_t *lock)
{
	int res = 1;
#pragma omp critical(__omp_rwlock__)
{
	if(lock->readers == 0)
		res = omp_test_lock(&lock->lock);
	if(res)
		lock->readers++;
}
	return res;
}


int omp_test_wlock(omp_rwlock_t *lock)
{
	int res = omp_test_lock(&lock->lock);
	if(res)
		assert(lock->readers == 0);
	return res;
}

GArik ★★★
() автор топика
Ответ на: комментарий от tim239

А что нужно сделать?

Нужно сделать readers/writer lock.

Может OpenMP <...> это и так умеет.

Может. Но я не знаю. Поэтому и спрашиваю.

Ещё у меня возникла пара вопросов:

  • Есть ли в gcc какие-то расширения к openmp?
  • Как можно проверить какая версия спецификации реализована в компиляторе (не обязательно gcc). Смотрел в cmake на FindOpenMP.cmake — там можно определить наличие поддержки и флаги, но не версию.
GArik ★★★
() автор топика
Ответ на: комментарий от GArik

Похоже на правду, но операция тестирования у тебя блокирующая(из-за критической секции), что imho не совсем то, что нужно.

YesSSS ★★★
()
Ответ на: комментарий от GArik

2.2 Conditional Compilation In implementations that support a preprocessor, the _OPENMP macro name is defined to have the decimal value yyyymm where yyyy and mm are the year and month designations of the version of the OpenMP API that the implementation supports. If this macro is the subject of a #define or a #undef preprocessing directive, the behavior is unspecified. For examples of conditional compilation, see Section A.3 on page 161.

3.0 May 2008 2.5 May 2005 2.0 March 2002

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

> 2.2 Conditional Compilation
Спасибо, не знал такого.

А про gcc уже нашёл документ с названием «The GNU OpenMP Implementation».

GArik ★★★
() автор топика
Ответ на: комментарий от GArik

«Может OpenMP это и так умеет» относилось к задаче, в которой потребовалось использовать rwlock'и. Но если в ТЗ написано «readers/writer lock», приведенный выше код выглядит рабочим.

tim239 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.