不熟悉的c语言表达,与pthreads有关



下面是一段代码。有人能解释一下最后三句脏话吗。我以前从未见过这种语法。我不知道那里发生了什么。这是其他东西的简写吗?

我将代码包含在三个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;

我们必须查看线程回调才能确定,但这听起来像是通过转换到void*来按值传递整数的可疑代码。

由于pthread回调获取void*并返回void*,因此显然有很多奇怪的想法,即这些空指针也可以用于按值传递整数。也就是说,向void*强制转换一个整数,而不是将指针指向已分配的对象。

当我们还处于32位PC时代时,这种脆弱的黑客可能是幸运的。如今,当x86_64指针通常是64位,但int仍然是32位时,情况就不那么糟了。

如果有问题的代码使用了这样的技巧,那么这就解释了unsigned long的奇怪且似乎毫无意义的转换。

不要使用这种糟糕的技巧。


关于表达式本身:bob == 0,这是一个简单的布尔运算。将等式/关系运算符的结果分配给bool变量是完全可以的。在实践中,这些运算符的返回类型在C中是int(与C++不同(,但不管怎样,该返回类型都可以安全地视为bool类型。

请记住,必须包含stdbool.h才能使用bool——在C中,这只是实际布尔关键字_Bool的宏。

double等于==是一个布尔运算符,例如。 if (x==0)

  • 如果x为零,则该语句的求值结果为true
  • 否则该语句将被评估为false

换句话说,就好像你说了

if trueif false

一些C编译器会识别bool语句,因为它只是一个宏(https://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html)。

因此,正如Alex F所说:x、 y和z的类型为bool(它们将被识别为true或false(。引用Alex F的话:如果bob==0,x=true,否则x=false

(无符号长(是一种类型种姓

最新更新