Skip to content
Implementation of Win32 events for *nix platforms, built on top of pthreads.
Latest commit 8059e0d May 28, 2016 @mqudsi mqudsi Improved sample.cpp with more randomness and signal handling
Included information on not using SetEvent/etc in signal handlers
due to posix interrupt behavior, and merged the sleeps in helper
threads with the wait itself for better (more immediate) handling
of triggered events.


pevents is a cross-platform C++ library meant to provide an
implementation of the WIN32 events for POSIX systems. pevents is built
on pthreads and provides *most* of the functionality of both manual-
and auto-reset events on Windows, most-notably including simultaneous
waits on multiple events (à la WaitForMultipleObjects). pevents is
also free of spurious wakeups - returns from waits are guaranteed

pevents also doubles as a thin, sane wrapper for CreateEvent() & co. on
Windows, meaning you can use pevents directly in your cross-platform
code without #ifdefs for Windows/pthreads.

pevents is developed and maintained by Mahmoud Al-Qudsi
<> of NeoSmart Technologies <>

While POSIX condition variables (pthread_cond_t) and WIN32 events both
provide the essential building blocks of the synchronization primitives
required to write multithreaded code with signaling, the nature of the
differences between the two have lent their way towards creating
different synchronization and multithreaded-programming paradigms.

Developers accustomed to WIN32 events might have a hard time
transitioning to condition variables; pevents aims to ease the
transition for Windows developers looking to write multithreaded code on
*nix by providing a familiar synchronization primitive that will allow
them to duplicate the essential features of WIN32 auto/manual-reset

As mentioned earlier, pevents provides most of the functionality of
WIN32 events. The only features not included are only named events and
support for security attributes.


pevents comes with two APIs: one along the lines of WIN32 functions and
the other for those more comfortable with pthread functions. They are
identical underneath the hood.

WIN32-style pevents API:

	neosmart_event_t CreateEvent(bool manualReset, bool initialState);

	int DestroyEvent(neosmart_event_t event);

	int WaitForEvent(neosmart_event_t event, uint64_t milliseconds);

	int WaitForMultipleEvents(neosmart_event_t *events, int count,
		bool waitAll, uint64_t milliseconds);

	int WaitForMultipleEvents(neosmart_event_t *events, int count,
		bool waitAll, uint64_t milliseconds, int &index);

	int SetEvent(neosmart_event_t event);

	int ResetEvent(neosmart_event_t event);

	int PulseEvent(neosmart_event_t event);

All the code is contained within pevents.cpp and pevents.h. You should
include these two files in your project as needed. All functions are in
the neosmart namespace. (Windows users should use win32.cpp instead of

Compilation options:

The following preprocessor definitions may be defined (-DOPTION) at
compile time to enable different features.

WFMO: Enables WFMO support in pevents. It is recommended to only compile
with WFMO support if you are taking advantage of the
WaitForMultipleEvents function, as it adds a (small) overhead to all
event objects.

PULSE: Enables the PulseEvent function. PulseEvent() on Windows is 
fundamentally broken and should not be relied upon — it will almost 
never do what you think you're doing when you call it. pevents includes 
this function only to make porting existing (flawed) code from WIN32 to 
*nix platforms easier, and this function is not compiled into pevents by
Something went wrong with that request. Please try again.