Bạn có thể sử dụng mutex bên trong khối bộ nhớ chia sẻ, nhưng mutex phải được khai báo là chia sẻ, do đó không phải là bất thường sử dụng mutexes bên trong chia sẻ bộ nhớ, u có thể làm cho lớp riêng, nó rất đơn giản:
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;
}
Nguồn
2013-11-11 14:35:54
ngã ba trả về một pid của quá trình con để các phụ huynh proces, tại sao không chỉ sử dụng mà thay vì tạo ra một số khác? Hoặc tôi hiểu sai câu hỏi của bạn –
@aleguna Bởi vì tôi muốn có một giá trị khác nhau, từ 0-255 và khi một quá trình rời khỏi chương trình này, nó sẽ miễn phí ID của nó sẽ được tái sử dụng. – dschatz
@dschatz: "* Bởi vì tôi muốn có một giá trị khác nhau, từ 0-255 *" Điều đó không giải thích * tại sao * bạn cần điều đó. Đặc biệt là khi cơ chế PID rất nhiều * tốt hơn *. –