jtsiomb / c11threads Goto Github PK
View Code? Open in Web Editor NEWPortable C11 threads implementation over POSIX threads and win32 threads.
Portable C11 threads implementation over POSIX threads and win32 threads.
Description: gcc build error "c11threads.h:LINE: error: static declaration of 'timespec_get' follows non-static declaration
static inline int timespec_get(struct timespec *ts, int base)"
Possible cause: #7 PTHREAD_MUTEX_TIMED_NP is not available outside of Linux
Specs: gcc version 5.4.0, on Ubuntu 16.04.2 LTS
STDC_VERSION = 201112L
More info:
At the beginning of c11threads.h PTHREAD_MUTEX_TIMED_NP
is checked, and if not found timespec_get
will be defined at the bottom of the header. pthread.h declares the timespec_get
function, and defines PTHREAD_MUTEX_TIMED_NP
as an enum value, and not a macro.
Why aren't you using <stdint.h>
when makes sense?
A few places where it would make sense are:
intptr_t
at c11threads.h:69.You might want use the __STDC_NO_THREADS__
feature test macro inside the header to check if the compiler / libc provides a implementation.
thrd_detach
is spelled thrd_detatch
.
https://github.com/jtsiomb/c11threads/blob/master/c11threads.h#L85
thrd_sleep
is returning void
but is expected to return int
, as specified here.
Hello.
This is actually about C11 threads on FreeBSD 13.2, using native C11 threads. What I mean is building the test but including real "threads.h" instead of "c11threads.h" and linking with "-lstdthreads", instead of "-lthr" (which is "-lpthread" on FreeBSD systems).
I'd expect the test to function identically. It does on (at least) AIX and Linux/glibc and Linux/musl.
The problem is on FreeBSD, using the real system C11 threads library, results in the following failure:
test.c:249: thrd_sleep(&dur, ((void *)0)): error 0, expected thrd_success
It all works as expected using the test with c11threads.h.
Would be nice to see some CI here, one good option might be https://travis-ci.org - really easy to integrate, especially for project like this.
Would be really nice to see win threads support here! I might do it because I'm quite desperate looking for C-only cross-platform threading lib.
When building grep 3.8 I see this issue. (I've saved c11threads.h to /usr/local/include/threads.h
on a i686 glibc 2.23 system.)
In file included from ./glthread/lock.h:87,
from glthread/lock.c:22:
/usr/local/include/threads.h:69:20: error: weak declaration of 'thrd_exit' must be public
69 | static inline void thrd_exit(int res)
| ^~~~~~~~~
make[3]: *** [Makefile:3661: glthread/libgreputils_a-lock.o] Error 1
Compiling on MacOS 12.6.1 fails because this value isn't defined.
It appears it was removed here 3124713#diff-9ba368accb8ef5a50e2b84baf275bbf34f8c9789c300c88f18bdbd51a1a805edL35-L36
There isn't a whole lot more to say, tbh.
When compiling on MinGW I get these warnings:
c11threads.h: In function 'thrd_exit':
c11threads.h:70:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
70 | pthread_exit((void*)(long)res);
| ^
c11threads.h: In function 'thrd_join':
c11threads.h:81:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
81 | *res = (int)(long)retval;
| ^
That's because long is 32 bit on this platform. The ideal solution would be to replace it with intptr_t but it is only (optionally) available since c99.
Maybe using long long when __MINGW64__
is defined will do.
Got this error:
c11threads.h:262:19: error: static declaration of 'timespec_get' follows non-static declaration
static inline int timespec_get(struct timespec *ts, int base)
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk/usr/include/time.h:199:5: note: previous declaration is here
int timespec_get(struct timespec *ts, int base);
Temporarily worked around it by changing:
#if __STDC_VERSION__ < 201112L || defined(C11THREADS_NO_TIMED_MUTEX)
/* TODO take base into account */
static inline int timespec_get(struct timespec *ts, int base)
to
#if __STDC_VERSION__ < 201112L
/* TODO take base into account */
static inline int timespec_get(struct timespec *ts, int base)
Didn't really dig to see what the "proper" fix is, but I suspect timespec_get() was added in a new version of the MacOSX SDK?
In mtx_lock()
, I think you should trap the dead-lock with an assert:
if(res == EDEADLK) {
assert(false); // Dead-locks are undefined behaviour
return thrd_busy;
}
According to the C11 standard, a dead-lock is undefined behaviour. However, with POSIX threads, the behaviour is well defined. What we want to avoid is client code silently discarding dead-locks, by calling mtx_lock()
, without paying attention to the return value, which turns into a no-op. Instead code should crash, at least in debug compiles, so programmers can see that they are relying on a deadlock (which is undefined).
What do you think ?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.