implementer un semaphore avec un mutex et une condition
Bonjour,
J'aurais voulu avoir votre opinion sur "comment implementer un semaphore en utilisant un mutex et une condition" avec pthread ?
Je sais que pthread possede deja des semaphores, mais j'aimerais en re-implementer un (pour le sujet [MT] Benchmark de produits matriciels sur processeurs multi-cores )
en gros, pthread est mal foutu pour mac et n'implemente pas ce qu'il faut pour faire des semaphores (en fait que ceux inter-processus et sont forcement nomm�s)
donc l'id�e serait de reimplementer un count semaphore...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class semaphore
{
private:
int count;
mutex mut;
condition cond;
semaphore(const self &);
const self &operator=(const self &);
public:
inline semaphore( ) { count = 1; }
inline semaphore(int n) { count = n; }
inline ~semaphore() {}
inline void release() {
mut.acquire();
count = count + 1;
cond.signal();
mut.release();
}
inline void release(int n) { for (int i=0; i<n; ++i) release(); }
inline void acquire() {
mut.acquire();
assert(count >= 0);
while(count == 0)
cond.wait(mut);
count = count - 1;
mut.release();
}
inline void acquire(int n) { for (int i=0; i<n; ++i) acquire(); }
inline bool try_acquire() { mutex::scoped_lock lock(mut); return count > 0; }
inline int try_acquire(int n) { mutex::scoped_lock lock(mut); return count > n ? n : count; }
}; |
�tes-vous d'accord ? (pthread est utilis� sous la couche d'abstraction)
je ne pense pas que le code soit bon pour
Code:
inline void acquire(int n) { for (int i=0; i<n; ++i) acquire(); }
http://www.developpez.net/forums/sho...&postcount=177
imaginons 2 threads qui se dispute 10 resources (semaphore) si chacun des threads en veut 8, he bien il y a blocage pur et simple parce que ils se seront allou�s chacun 5 resources par exemple ....
il vaudrait mieux faire acquerir n resources ou rien...
Qu'en pensez-vous ?
Merci d'avance pour vos conseils,
a+