незнакомое c выражение языка, связанное с pthreads - PullRequest
0 голосов
/ 06 апреля 2020

Вот фрагмент кода. Может кто-нибудь объяснить, пожалуйста, последние три утверждения бул. Я никогда не видел этот синтаксис раньше. Я не знаю, что там происходит. Это сокращение для чего-то еще?

Я включил код выше трех операторов bool, чтобы придать некоторый контекст.

void *bob;
void *tod;
void *jon;

pthread_t *thrdA= malloc(9 * sizeof(pthread_t));
pthread_t *thrdB= malloc(9 * sizeof(pthread_t));
pthread_t *thrdC = malloc(9 * sizeof(pthread_t));

for(int i = 0; i<9; i++) {
    pthread_create(&thrdA[i], NULL, FUNCT1, (void*)SAS);
}

for(int i = 0; i<9; i++) {
    pthread_create(&thrdB[i], NULL, FUNCT2, (void*)SAS);
}

int x= 0;
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        pthread_create(&thrdC[x], NULL, FUNCT3, (void*)SAS);
        x++;
    }
}
for(int i=0; i<9; i++) {
   pthread_join(thrdA[i], &bob);
   pthread_join(thrdB[i], &tod);
   pthread_join(thrdC[i], &jon);
}    


bool x = (unsigned long)bob== 0;
bool z = (unsigned long)tod== 0;
bool y = (unsigned long)jon== 0;

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Мы должны увидеть обратный вызов потока, чтобы знать наверняка, но это пахнет как подозрительный код, передающий целые числа по значению путем преобразования в / из void*.

, поскольку обратный вызов pthread занимает void* и возвращает void*, очевидно, существует множество странных идей, что эти пустые указатели можно также использовать для передачи целых чисел по значению. То есть приведите целое число к / из void*, вместо того, чтобы указатель указывал на выделенный объект.

Такие хрупкие хаки, возможно, сработали по счастливой случайности, когда мы все еще были в 32-битном P C эпохи. В наши дни меньше, когда указатели x86_64 обычно 64-битные, а int остаются 32-битными.

Если в рассматриваемом коде используются такие хаки, то это объясняет странное и, казалось бы, бессмысленное приведение к unsigned long.

Не не используйте такие дрянные хаки, точка.


Что касается самого выражения: bob == 0, это простая логическая арифметика c. Совершенно нормально присвоить результат равенства / реляционных операторов переменной bool. На практике тип возвращаемого значения этих операторов равен int в C (в отличие от C ++), но этот тип возвращаемого значения можно смело рассматривать как тип bool независимо от того.

Имейте в виду, что вы должны включить stdbool.h для использования bool - в C это просто макрос для действительного логического ключевого слова _Bool.

0 голосов
/ 06 апреля 2020

Двойное равенство == является логическим оператором, например, if (x==0)

  • , если x равен нулю, оператор оценивается как true
  • , иначе оператор будет оцениваться как false

другими словами, это как если бы вы сказали

if true или if false

Некоторые C компиляторы распознают оператор bool так, как он просто макрос (https://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html).

По сути, как сказал Алекс Ф: x, y и z относятся к типу bool (они будут распознаваться как true или false) на основе при возврате булева выражения, вычисляемого перед ними. Процитируем Алекса F: если bob == 0, x = true, иначе x = false

(длинный без знака) является типом касты

...