using Intel TBB in C

c, c++, intel, tbb

Solution

hivert is right, C and C++ are different languages.

Try this:

#include<pthread.h>
#include<stdio.h>
#include<tbb/atomic.h>

#define NUM_OF_THREADS 16

tbb::atomic<int> counter;

void *simpleCounter(void *threadId)
{
    int i;
    for(i=0;i<256;i++)
    {
        counter.fetch_and_add(1);
    }
    printf("T%ld \t Counter %d\n", (long) threadId, (int)counter);
    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    counter=0;
    pthread_t threadArray[NUM_OF_THREADS];
    long i;
    for(i=0;i<NUM_OF_THREADS;i++)
    {
        pthread_create(&threadArray[i], NULL, simpleCounter, (void *)i);
    }
    for(i=0;i<NUM_OF_THREADS;i++)
        pthread_join(threadArray[i], nullptr);
}

Save it with .cpp extension (not required with g++). I modified the missing namespace tbb::atomic and I also included a join in the end, to wait all threads to finish before quitting main. It should compile now. Add -std=c++11 as a compiler option, or change nullptr to NULL.

Problem

I'm trying to use Intel TBB in C. All the documentation I get for TBB are targeted towards C++. Does TBB work with plain C? If yes how do I define an atomic integer. In the below code I tried using a template `atomic<int> counter` (I know this will not work in C). Is there a way to fix this? ``` #include<pthread.h> #include<stdio.h> #include<tbb/atomic.h> #define NUM_OF_THREADS 16 atomic<int> counter; void *simpleCounter(void *threadId) { int i; for(i=0;i<256;i++) { counter.fetch_and_add(1); } printf("T%ld \t Counter %d\n", (long) threadId, counter); pthread_exit(NULL); } int main(int argc, char *argv[]) { counter=0; pthread_t threadArray[NUM_OF_THREADS]; long i; for(i=0;i<NUM_OF_THREADS;i++) { pthread_create(&threadArray[i], NULL, simpleCounter, (void *)i); } pthread_exit(NULL); } ``` ``` -bash-4.1$ g++ simpleCounter.c -I$TBB_INCLUDE -Wl,-rpath,$TBB_LIBRARY_RELEASE -L$TBB_LIBRARY_RELEASE -ltbb simpleCounter.c:7: error: expected constructor, destructor, or type conversion before ‘<’ token simpleCounter.c: In function ‘void* simpleCounter(void*)’: simpleCounter.c:16: error: ‘counter’ was not declared in this scope simpleCounter.c:18: error: ‘counter’ was not declared in this scope simpleCounter.c: In function ‘int main(int, char**)’: simpleCounter.c:24: error: ‘counter’ was not declared in this scope ```

Original source