GCC AtomicBuiltins странные вещи в GCC 4.1.1 - PullRequest
0 голосов
/ 22 сентября 2018

В 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 '

Я не знаю, почему? что-то не так понимаю?

1 Ответ

0 голосов
/ 22 сентября 2018

Если конкретная функция __sync не может поддерживаться в целевой архитектуре, GCC обрабатывает ее как внешнюю функцию (в случае, если вы хотите предоставить реализацию).Если он это делает, он добавляет размер элемента;вот откуда приходит 4.Кажется, выбранная вами целевая архитектура не поддерживает атомарные add_and_fetch для 4-байтовых типов (что заставляет меня подозревать, что она вообще не поддерживает атомарные встроенные функции).Может помочь использование параметра компилятора -march для принудительного использования определенной архитектуры;попробуйте просто -march=native и посмотрите, достаточно ли это.

Кстати, для версий GCC, которые их поддерживают, вам следует использовать встроенные __atomic вместо встроенных __sync.Встроенные __atomic дают вам лучший контроль над порядком памяти, потенциально повышая производительность.(Оба набора встроенных функций демонстрируют одну и ту же проблему, когда вы пытаетесь использовать их в архитектуре, которая их не поддерживает.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...