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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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+