Итак, я прочитал, что на 32-битной машине можно использовать операцию CAS
с выровненными 64-битными блоками. Точно так же на 64-битной машине можно использовать операцию CAS
с выровненными 128-битными блоками.
Я использую 32-битную машину, поэтому я попробовал следующее:
// sizeof(long long) is 8 bytes, so 64 bits
long long y = 12;
long long z = 12;
long long x = 99;
__sync_bool_compare_and_swap(&y, z, x);
и CAS
удалось изменить значение y
на 99
.
Но затем я попытался использовать char array[8];
(размер которого составляет 64 бита) вместо long long
. И я делаю:
char full[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};
char full2[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};
char full3[8] = {'5', '8', '9', 'G', 'X', '5', '6', 'U'};
__sync_bool_compare_and_swap(full, full2, full3);
Но в этом случае CAS
терпит неудачу, хотя full
и full2
имеют точно такие же данные. (Я также проверил, что full
и full2
правильно выровнены)
Итак, в первый раз кажется, что CAS
можно использовать для 64-битной, но во второй раз кажется, что это невозможно. Есть идеи, почему?
ИЗМЕНИТЬ
(Как насчет 64-битных машин?)
Итак, проблема была в том, что я использовал char *
в своем CAS
, а они были только проверены. Таким образом, решение состояло в том, чтобы привести к long long
или uint64_t
, которые являются 64-битными значениями.
Но что мне делать с 64-битной машиной, когда мне нужно использовать 128-битное значение? long long
по-прежнему 64-битный на 64-битной машине, а uint128_t
, похоже, не существует в C. Так к какому типу мне следует привести? double long
кажется 128-битным на моей 64-битной машине, но при выполнении следующих действий:
double long y = 32432143243214;
double long z = 32432143243214;
int x = __sync_bool_compare_and_swap(&y, z, 1234321990);
Я получаю эту ошибку компиляции error: incompatible type for argument 1 of ‘__sync_bool_compare_and_swap’
.