Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

using Intel TBB in C

Tags:

c++

c

intel

tbb

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
like image 296
arunmoezhi Avatar asked Sep 15 '25 03:09

arunmoezhi


2 Answers

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.

like image 89
nmenezes Avatar answered Sep 16 '25 18:09

nmenezes


C and C++ are different language. Intel TBB is only a C++ library.

like image 27
hivert Avatar answered Sep 16 '25 17:09

hivert