#include <sys/neutrino.h>
int SyncMutexRevive(sync_t* sync);
int SyncMutexRevive_r(sync_t* sync);ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ [36]ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ
DEADDEADΠΡΠΈΠ±ΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ:
ΠFAULT
EINVALDEAD
ETIMEDOUTTimerTimeout()ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΡΡΡΠ΅ΠΊΡΠ° ΠΊΠ°ΠΊ
DEADSyncMutexEvent()
#include <sys/neutrino.h>
int SyncMutexEvent(sync_t* sync, struct sigevent* event);
int SyncMutexEvent_r(sync_t* sync, struct sigevent* event);ΠΠ°Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΡΡΡΠ΅ΠΊΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
DEADDEADSyncMutexRevive()ΠΡΠΈΠ±ΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ:
EAGAIN
EFAULTsync
EINVALsyncΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ°
ΠΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π½Π°Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»Π°, ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π΄Π»Ρ ΡΠ»ΡΡΠ°Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ² Π΄Π°Π½Π½ΡΡ . ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
push()pop()
/* Π¨Π°Π±Π»ΠΎΠ½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π΄Π°Π½Π½ΡΡ
*/
template <class T> class CDataQueue {
public:
Β CDataQueue() { pthread_mutex_init(&_mutex, NULL); }
Β ~CDataQueue() { pthread_mutex_destroy(&_mutex); }
Β void push(T _new_data) {
<b>Β pthread_mutex_lock(&_mutex);</b>
Β data_queue.push(_new_data);
Β data_event.reset();
<b>Β pthread_mutex_unlock(&_mutex);</b>
Β }
Β T pop() {
Β data_event.wait();
<b>Β pthread_mutex_lock(&_mutex);</b>
Β T res = data_queue.front();
Β data_queue.pop();
<b>Β pthread_mutex_unlock(&_mutex);</b>
Β return res;
Β }
private:
Β std::queue<T> data_queue;
Β event data_event;
Β pthread_mutex_t _mutex;
};ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ Π·Π°Π΄Π°ΡΠ° ΠΎΡΠ΅Π²ΠΈΠ΄Π½Π°: Π½Π°Π΄ΠΎ Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π²ΡΡ ΡΡΠ°ΡΡΠΊΠΎΠ² ΠΊΠΎΠ΄Π°. ΠΠΎΡΠ΅ΠΌΡ ΠΆΠ΅ Π½Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΡ ΠΎΠΏΠΈΡΡΠ²Π°Π»ΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΈ ΠΎ ΡΠΏΠΎΡΠΎΠ±Π°Ρ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ? ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΌΡ Ρ ΠΎΡΠ΅Π»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, Π½Π΅ Π·Π°Π²ΠΈΡΡΡΠ΅Π΅ ΠΎΡ Π΄ΠΎΠΏΡΡΠ΅Π½ΠΈΠΉ ΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΠΎΠ³Π΄Π° ΠΌΡ ΡΡΡΠΎΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π²ΠΎΠΏΡΠΎΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡΠ²Π½ΠΎΠ³ΠΎ Π²Π»ΠΈΡΠ½ΠΈΡ ΡΠ°Π·Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΡΠΌ. ΠΡ ΡΠΆΠ΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ ΡΡΡΠ΅ΠΊΡ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ² ΠΈ ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΅Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ
Π ΡΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡΠ΅ΡΠ²Π΅ΠΌ Π½Π°ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅: ΠΌΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ Π΄Π²ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ , Π²Π°ΠΆΠ½ΡΡ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ β ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠ°. Π’Π΅ΠΏΠ΅ΡΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΊΠΎΡΠΎΡΠΊΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΈ ΠΏΡΠΎΠ²Π΅Π΄Π΅ΠΌ ΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΎΡΠ΅Π½ΠΈΡΡ Π·Π°ΡΡΠ°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΡΡΠΈΠΌΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ.
ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ ΡΡΠΈ Π΄Π²Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π² Π²ΡΡΡΠ΅ΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΠ΅ΡΡ Π·Π°Ρ ΠΎΠ΄ΠΈΡ ΠΎ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ΅, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠ° 0 Π»ΠΈΠ±ΠΎ 1. ΠΠ°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ, ΡΡΠΎ ΠΈ Π² ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡΡ , ΠΈ Π΄Π°ΠΆΠ΅ Π² Π½Π΅ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΡΠ΅ΡΠΈΡΡ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ, ΡΡΠΎ ΡΡΠΎ Β«ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅Β». Π‘Π΅ΠΉΡΠ°Ρ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΡΠΈ Π΄Π²Π° ΡΡ ΠΎΠ΄Π½ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ Π²ΡΠ΅ΠΌ: ΠΈ Π·Π°ΡΡΠ°ΡΠ°ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΈΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅, ΠΈ ΡΠ΅Π»ΡΠΌΠΈ ΠΈ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ ΠΏΡΠΈΠ·Π²Π°Π½Ρ ΡΠ΅ΡΠ°ΡΡ, ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈβ¦ ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΎΡΠ΅Π½ΠΊΠΈ Π·Π°ΡΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ², ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΡ ΡΡΠ°Π½ΡΡ Π½Π°ΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ½ΡΡΠ½Π΅Π΅.
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠ°ΠΊΠΈΡ ΠΎΡΠ΅Π½ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ²ΡΡΡΡΡ Π½Π°ΠΌΠΈ ΡΡ Π΅ΠΌΡ Β«ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΡ Β» ΡΠ΅ΡΡΠΎΠ². ΠΠΎΡΠ΅ΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡ ? ΠΠ°, Π·Π΄Π΅ΡΡ Π½Π°ΠΌ Π½Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ Π² ΡΠ²Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΎΠ±ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Β«ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΠΌΠΈΒ» ΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΏΡΠΎΡΡΠΎ Π² ΡΠΈΠ»Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π΅Π»ΠΎΠΊ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΆΠ΅ Π±ΡΠ»ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΡΠ°Π½Π΅Π΅. ΠΡΠ°ΠΊ, ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅ΡΡΠ° Π΄Π»Ρ ΠΌΡΡΡΠ΅ΠΊΡΠ° ( ΡΠ°ΠΉΠ» sy20m.cc):
unsigned long N = 1000;
static pthread_barrier_t bstart;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;