Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re^5: OT: Locking and syncing mechanisms available on *nix.

by Illuminatus (Curate)
on Mar 28, 2011 at 16:06 UTC ( [id://895950]=note: print w/replies, xml ) Need Help??


in reply to Re^4: OT: Locking and syncing mechanisms available on *nix.
in thread OT: Locking and syncing mechanisms available on *nix.

One last note and I'm done. I'm not sure which half of the internet you are looking at regarding mutex's, but there is a lot of stuff that comes up on searches that is fairly old. The Linux thread implementation was completely rewritten for 2.6 (about 6 years ago). I did not have a chance to look at the conditional var code, but I looked at the mutex code for more recent libc releases (2.12), and pthread_mutex_lock runs completely in user-space unless contention occurs. Only then does it go to the kernel to block the thread. You can also use pthread_mutex_trylock to see if contention would occur, and this also runs completely in user-space. This is mentioned in the NPTL white paper on p8-9.

The futex API is exposed for these implementations, but filled with caveats about 'you better know what you are doing'. This approach would limit your compatibility to Linux.

Lastly, I found this list of links to implementations of the kind of algorithms you are looking for. I took a look at the atomic_io in qprof, and it looks fairly complete, if primitive.

It is likely that all of these will give you portability issues if you really need *nix flexibility

fnord

  • Comment on Re^5: OT: Locking and syncing mechanisms available on *nix.

Replies are listed 'Best First'.
Re^6: OT: Locking and syncing mechanisms available on *nix.
by BrowserUk (Patriarch) on Mar 28, 2011 at 16:53 UTC

    First off. Many thanks for all the links. I will read them avidly.

    With respect to out-of-date material. I am concious that I wouldn't even know without lookingit up, what is the current version of anything *nix. So, dates and versions go right over my head. In part, that's the reason for seeking expert advice.

    but I looked at the mutex code for more recent libc releases (2.12), and pthread_mutex_lock runs completely in user-space unless contention occurs.

    That's cool, and a great advance. But it still means acquiring a lock that I don't need or want, for every iteration at both ends. It may be that with modern mutexes and low contention, that is insignificant, but it still dictates a certain algorithmic logic that is effectively the reverse of what I actually need.

    It means acquiring the mutex every time, and signalling every time in case someone else was waiting on it. And doing that at both ends every time.

    The theory of my design is that you block or signal if you hit one end of the buffer or the other. The rest of the time, no blocking or signalling is required. Ultimately, the notion is to have the code monitor itself for the frequency of under/over-runs, and increase the size of the buffer (semi-automatically within bounds) if they are too frequent.

    If the buffer was unlimited, then everything can be added, and everything removed without ever encountering a block except at start-up and close-down. That's impractical for real world systems, but so long as the producer produces just slightly faster than the consumers consume, that nirvana is theoretically achievable within practical memory bounds. Of course, there will always be some other threads that will intervene and upset the apple cart, but the hope is to minimise them, not eliminate them completely.

    I'm also looking at starting with a brief spin loop falling over to a (context switch inducing) micro-sleep to save cpu. In theory this can reduce elective context switches by an order of magnitude or more.

    The other part of the reason for asking here, is to find actual implementations for reference. Whilst using MS Event objects works quite well, I'm still seeking to do better. This isn't an urgent (for me) problem to be solved, but part of an ongoing research into better mechanisms.

    If there is a widely ported, reliable library available, then it makes sense for me to try and use/crib from that for my Windows implementation. Both because it is likely quicker for me to benefit from others labours; but also because if this ever makes it to release, it would potentially make porting it to (some) *nixes easier should anyone care to take on that task.


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://895950]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (2)
As of 2024-04-25 22:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found