È possibile utilizzare mutex all'interno del blocco di memoria condivisa, ma il mutex deve essere dichiarato come condiviso, pertanto, non è insolito usando mutex all'interno della memoria azione, u può fare propria classe, è molto semplice:
class Mutex {
private:
void *_handle;
public:
Mutex(void *shmMemMutex, bool recursive =false,);
virtual ~Mutex();
void lock();
void unlock();
bool tryLock();
};
Mutex::Mutex(void *shmMemMutex, bool recursive)
{
_handle = shmMemMutex;
pthread_mutexattr_t attr;
::pthread_mutexattr_init(&attr);
::pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
::pthread_mutexattr_settype(&attr, recursive ? PTHREAD_MUTEX_RECURSIVE_NP : PTHREAD_MUTEX_FAST_NP);
if (::pthread_mutex_init((pthread_mutex_t*)_handle, &attr) == -1) {
::free(_handle);
throw ThreadException("Unable to create mutex");
}
}
Mutex::~Mutex()
{
::pthread_mutex_destroy((pthread_mutex_t*)_handle);
}
void Mutex::lock()
{
if (::pthread_mutex_lock((pthread_mutex_t*)_handle) != 0) {
throw ThreadException("Unable to lock mutex");
}
}
void Mutex::unlock()
{
if (::pthread_mutex_unlock((pthread_mutex_t*)_handle) != 0) {
throw ThreadException("Unable to unlock mutex");
}
}
bool Mutex::tryLock()
{
int tryResult = ::pthread_mutex_trylock((pthread_mutex_t*)_handle);
if (tryResult != 0) {
if (EBUSY == tryResult) return false;
throw ThreadException("Unable to lock mutex");
}
return true;
}
fonte
2013-11-11 14:35:54
fork restituisce un pid di processo figlio ai processori padre, perché non utilizzarlo solo anziché generarne un altro? Oppure sto fraintendendo la tua domanda –
@aleguna Perché vorrei un valore compreso tra 0-255 e quando un processo lascia questo programma dovrebbe liberare il suo ID da riutilizzare. – dschatz
@dschatz: "* Perché vorrei un valore compreso tra 0-255 *" Questo non spiega * perché * è necessario. Soprattutto quando il meccanismo PID è tanto * migliore *. –