Обсуждение: pthread portability
The below diff fixes one problem: you can't compare pthread_t values directly. Only the function pthread_equal(3) is defined. Direct comparison usually works because most implementations define pthread_t as an integer type. Relatedly, INVALID_THREAD is defined as (pthread_t)0. I don't think this is a portable way of checking whether a thread is valid, and I don't know if it's actually possible to get an "invalid" thread out of pthread_create(3) if it succeeds (returns 0). In the cases where you're setting a pthread_t to INVALID_THREAD, maybe using a struct that includes a pthread_t and a 'valid' bool would be preferable. Thanks for your time, Michael diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 4196b0e..f2e5aed 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3791,7 +3791,7 @@ main(int argc, char **argv) { int err = pthread_create(&thread->thread,NULL, threadRun, thread); - if (err != 0 || thread->thread == INVALID_THREAD) + if (err != 0 || pthread_equal(thread->thread, INVALID_THREAD)) { fprintf(stderr, "couldnot create thread: %s\n", strerror(err)); exit(1); @@ -3819,7 +3819,7 @@ main(int argc, char **argv) TState *thread = &threads[i];#ifdef ENABLE_THREAD_SAFETY - if (threads[i].thread == INVALID_THREAD) + if (pthread_equal(threads[i].thread, INVALID_THREAD)) /* actually run this thread directly in the mainthread */ (void) threadRun(thread); else
Michael McConville wrote: > The below diff fixes one problem: you can't compare pthread_t values > directly. Only the function pthread_equal(3) is defined. Direct > comparison usually works because most implementations define pthread_t > as an integer type. So is there a platform where this assumption doesn't hold? -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
## Alvaro Herrera (alvherre@2ndquadrant.com): > > The below diff fixes one problem: you can't compare pthread_t values > > directly. Only the function pthread_equal(3) is defined. Direct > > comparison usually works because most implementations define pthread_t > > as an integer type. > > So is there a platform where this assumption doesn't hold? E.g. FreeBSD has "typedef struct pthread *pthread_t;" with a non-trivial "struct pthread". Regards, Christoph -- Spare Space
Christoph Moench-Tegeder <cmt@burggraben.net> writes: > ## Alvaro Herrera (alvherre@2ndquadrant.com): >>> The below diff fixes one problem: you can't compare pthread_t values >>> directly. Only the function pthread_equal(3) is defined. Direct >>> comparison usually works because most implementations define pthread_t >>> as an integer type. >> So is there a platform where this assumption doesn't hold? > E.g. FreeBSD has "typedef struct pthread *pthread_t;" with a > non-trivial "struct pthread". Seems like pointer comparison would be sufficient in that case, so I'm still not following what real-world problem this change fixes. I read the POSIX spec's rationale for pthread_equal and found it utterly unconvincing, BTW. If pthread_equal tries to dereference the given pointer and said pointer is stale, what is the reason to think it even points to still-allocated memory? regards, tom lane
Alvaro Herrera wrote: > Michael McConville wrote: > > The below diff fixes one problem: you can't compare pthread_t values > > directly. Only the function pthread_equal(3) is defined. Direct > > comparison usually works because most implementations define > > pthread_t as an integer type. > > So is there a platform where this assumption doesn't hold? Not sure.