Linked by Elad Lahav on Thu 18th Feb 2016 19:27 UTC
QNX

A mutex is a common type of lock used to serialize concurrent access by multiple threads to shared resources. While support for POSIX mutexes in the QNX Neutrino Realtime OS dates back to the early days of the system, this area of the code has seen considerable changes in the last couple of years.

Permalink for comment 624993
To read all comments associated with this story, please click here.
Mutex behavior
by Alfman on Fri 19th Feb 2016 00:10 UTC
Alfman
Member since:
2011-01-28

In a recent project, I encountered bugs due to undefined conditions of the pthread mutex.

I needed to capture a mutex, hold it across thread invocation, and then release it. Turns out that there's no defined behavior in this scenario.

http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_mutex_lo...

If a thread attempts to unlock a mutex that it has not locked or a mutex which is unlocked, undefined behaviour results.


So I opted to use the posix semaphore mechanisms sem_post sem_wait instead, which behaves as expected even under edge conditions.

I wish I could change one thing about posix semaphores: that one could wait on any number of events instead of decremented them one at a time. If 20 threads call sem_post(semaphore), the blocking thread has to call sem_wait 20 times just to decrement the counter back to zero.

while(true) {
sem_wait(semaphore);
// process thread events 20 times even if only the first iteration is productive
}


Turns out Linux kernel devs recognized this deficiency and corrected it with eventfd, although it's proprietary to linux and uses a new read/write syscall API.

Man, software development entails so many little factoids, if I had to start over, I don't even want to think about it ;)

Reply Score: 2