В gcc doc ссылка gcc-doc Я вижу, что в gcc версии 4.1.1 есть атомарные встроенные функции.
в моем проекте мы используем gcc 4.1.1 в centos5.0, то после компиляции наш проект работает хорошо после centos5.0.Вот мой тестовый код.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdbool.h>
static int count = 0;
void *test_func(void *arg)
{
int i=0;
int result = 0;
for(i=0;i<2000;++i)
{
__sync_add_and_fetch(&count,1);
}
return NULL;
}
int main(int argc, const char *argv[])
{
pthread_t id[10];
int i = 0;
for(i=0;i<10;++i){
pthread_create(&id[i],NULL,test_func,NULL);
}
for(i=0;i<10;++i){
pthread_join(id[i],NULL);
}
//10*2000=20000
printf("%u\n",count);
return 0;
}
, когда я изменяю функцию на следующее:
void *test_func(void *arg)
{
int i=0;
int result = 0;
for(i=0;i<2000;++i)
{
result = __sync_add_and_fetch(&count,1);
}
return NULL;
}
gcc -g -o code code.c -lpthread
, тогда компиляция идет не так: неопределенная ссылка на `__sync_add_and_fetch_4 'I don'Я не знаю, почему это не так.
Теперь я хочу использовать функцию: __ sync_val_compare_and_swap, вот демоверсия из stackoverflow
#include <stdio.h>
#include <inttypes.h>
#include <pthread.h>
#include <stdbool.h>
#include <assert.h>
volatile bool lock;
void *locktest( void *arg )
{
int i = 0;
for ( i = 0 ; i < 100000 ; ++i )
{
// acquire a lock
while( __sync_val_compare_and_swap( &lock, false, true ) == true )
{
// Spin while we don't acquire
}
// make sure we have the lock
assert( lock == true );
// release the lock
assert( __sync_val_compare_and_swap( &lock, true, false ) == true );
}
}
int main (void)
{
return 0;
}
здесь неправильная компиляция с: /root / library / demo / sync_val_compare.c: 14: неопределенная ссылка на __sync_val_compare_and_swap_1'
/root/library/demo/sync_val_compare.c:23: undefined reference to
__ sync_val_compare_and_swap_1 '
Я не знаю, почему? что-то не так понимаю?