Was my decision to use C threads unwise?

neo [he/him]@hexbear.net to Programming@programming.dev – 9 points –

Without realizing what I was getting myself into, I wrote some code using C11's threads.h (EDIT: every time I use the angle brackets < and > they just get eaten, even in the code snippet block.) I'm realizing after the fact that this is basically only supported on Linux (gcc/clang). This is my target platform, but I guess if I could cross compile to Windows or macOS that would be nice, too.

C's threads nominally appear to be a great feature. Finally, a standardized and straightforward interface to threads that would be cross-platform compatible. The reality appears to be anything but.

So is it worth just replacing that code with pthreads? Is there some near-term development on C threads that might make this worthwhile to use? I'm kind of surprised it hasn't really caught on some 12 years after the standard was introduced.

6

pthreads is fine and widely supported. I would probably recommend that interface for now. Maybe after 5 years or so when all of the LTS systems support the new standard that will be the better option, but all major OSes are POSIX compatible so no need for a new standard anyways.

Also if you want to take advantage of any OS-specific extensions they are probably supported by pthreads, but the new C threads API will probably lag.

As far as I know, C's threads.h implementation (or std::thread for C++) is based on POSIX threads.

If you're using CMake or a similar build system that can define macros when building from Windows, then one option you have is to simply create an interface of sorts.
Something like:

// angle brackes work for this codeblock? idk

#ifdef PLATFORM_WIN32
   // The syntax MSVC wants (which I'm not familiar with)
   #include "fuckmissingbracketsidontrememberwhatiwrotehere"
   thread_t win32_create_thread( /* ... */ ) {
      /* ... */
   }
#else
   // The syntax sensible compilers want (which I'm also unfamiliar with because I forgor U+1F480)
   #include "fuckmissingbracketsidontrememberwhatiwrotehere"
   int thrd_create( /* ... */ ) {
      /* ... */
   }
#endif

It may be a bit tedious, but I don't know if there is some widely known C equivalent to the Boost library, at least for threads.

1 more...