Pthread and gcc compiling issue on OS X

14,368

Solution 1

According to info about pthread_barriers on opengroup.org, barriers are defined in the optional part of POSIX standard; the name of option is "(ADVANCED REALTIME THREADS)", sometimes more exact referred as "BAR, barriers (real-time)".

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap02.html

The system may support one or more options (see Options) denoted by the following symbolic constants:

_POSIX_BARRIERS

So, only if the _POSIX_BARRIERS macro is defined as positive number, you can use pthread_barrier_t or pthread_barrier_wait.

Mac OS X is POSIX Compliant, but full list of implemented options is not available online. There is a letter in apple mainling list from 2006, which says there is no barriers in Mac OS X.

I know that Solaris had some problems with pthread_barrier too.

Solution 2

Just like osgx mentioned, barriers are not implemented on OS X, but you can always implement it or just use this implementation. Quick note on the previous implementation, you can use the macro that osgx mentioned, _POSIX_BARRIERS, instead of the ones on the blog, like this #if !defined _POSIX_BARRIERS || _POSIX_BARRIERS < 0

Share:
14,368
Dolan Antenucci
Author by

Dolan Antenucci

Updated on June 04, 2022

Comments

  • Dolan Antenucci
    Dolan Antenucci almost 2 years

    I have a script that compiles fine on Linux (Ubuntu 11.04), but not on OS X (Lion).

    gcc -pthread -o hw1 hw1.c 
    hw1.c:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘barr’
    hw1.c: In function ‘__syncthreads’:
    hw1.c:53: error: ‘barr’ undeclared (first use in this function)
    hw1.c:53: error: (Each undeclared identifier is reported only once
    hw1.c:53: error: for each function it appears in.)
    hw1.c:54: error: ‘PTHREAD_BARRIER_SERIAL_THREAD’ undeclared (first use in this function)
    hw1.c: In function ‘parallel_psum’:
    hw1.c:94: error: ‘barr’ undeclared (first use in this function)
    hw1.c:107: warning: assignment from incompatible pointer type
    

    Here's the first 22 lines of the code:

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <math.h>
    #include <sys/time.h>
    #include <pthread.h>
    #include <assert.h>
    
    /* create thread argument struct for thr_func() */
    typedef struct _thread_data_t {
        int tid;
        int* ints;
        int* sums;
        int num_ints;
        int* temp;
    } thread_data_t;
    
    const int MIN_RAND_INT = 1;
    const int MAX_RAND_INT = 65000;
    
    // pthreads barrier variable
    pthread_barrier_t barr;
    

    Any ideas why this is happening?