强制转换和参数警告

戈尔卡G

我有以下代码,可以毫无错误地进行编译和执行,但是编译器会显示一些我想“解决”的警告。

那就是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

typedef struct s_Barrier{
    sem_t sEntry, sMutEx, sExit;
    int nTaskInBarrier;
}Barrier;

void createTasks(pthread_t threads[]);
void task(void *arg);
void initBarrier(Barrier *pb, int n);
void destroyBarrier(Barrier *pb);
void waitInBarrier(Barrier *pb);


Barrier barrier;
int nTask = 5;


int main(void) {
    pthread_t threads[nTask];

    initBarrier(&barrier,nTask);
    createTasks(threads);
    destroyBarrier(&barrier);

    return 0;
}

void createTasks(pthread_t threads[]){
    int i;

    for(i = 0; i < nTask; i++){
        pthread_create(&threads[i], NULL, task, (void*)i);
    }

    for(i = 0; i < nTask; i++){
        pthread_join(threads[i], NULL);
    }
}

void initBarrier(Barrier *pb, int n){
    pb->nTaskInBarrier = 0;

    sem_init(&pb->sEntry,0,n);
    sem_init(&pb->sExit,0,1);
    sem_init(&pb->sMutEx,0,1);
}

void destroyBarrier(Barrier *pb){
    sem_destroy(&pb->sEntry);
    sem_destroy(&pb->sExit);
    sem_destroy(&pb->sMutEx);
}

void task(void *arg){
    int i = (int) arg;
    while(1){
        printf("I'm thread %d\n",i);
        waitInBarrier(&barrier);
    }
}

void waitInBarrier(Barrier *pb){
    int x;
    int i;

    sem_wait(&pb->sEntry);
    sem_wait(&pb->sMutEx);

    x = ++pb->nTaskInBarrier;

    sem_post(&pb->sMutEx);

    if(x < nTask){
        sem_wait(&pb->sExit);
    }else{
        for(i = 0; x < nTask ; i++){
            sem_post(&pb->sExit);
        }
    }

    sem_wait(&pb->sMutEx);

    x = --pb->nTaskInBarrier;

    sem_post(&pb->sMutEx);

    if(x == 0){
        for(i = 0; x < nTask ; i++){
            sem_post(&pb->sEntry);
        }
    }

}

当我使用“ gcc -o Barrier 3.4Barrier.c -pthread”进行编译时,收到以下警告。

3.4Barrier.c: In function ‘createTasks’:
3.4Barrier.c:47:43: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   pthread_create(&threads[i], NULL, task, (void*)i);
                                       ^
    3.4Barrier.c:47:37: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [-Wincompatible-pointer-types]
   pthread_create(&threads[i], NULL, task, (void*)i);
                                 ^
In file included from 3.4Barrier.c:13:0:
/usr/include/pthread.h:233:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)(void *)’
 extern int pthread_create (pthread_t *__restrict __newthread,
        ^
    3.4Barrier.c: In function ‘task’:
    3.4Barrier.c:70:10: warning: cast from pointer to integer of different size     [-Wpointer-to-int-cast]
  int i = (int) arg;
霍尔特

第一个问题是task应该返回void*,而不是void按照原型所指定的pthread_create

void* task(void *arg) {
    // ...
    return NULL;
}

这很容易解决。

第二个问题是,您不应通过i这种方式-不应将强制int转换为void*传递i给它的一种方法task是分配一个小的内存空间并使用它1

for(i = 0; i < nTask; i++){
    int *pi = malloc(sizeof(int));
    if (pi == NULL) { 
        // Something wrong...
    }
    *pi = i;
    pthread_create(&threads[i], NULL, task, pi);
}

和:

void* task(void *arg){
    int i = *(int*)arg; // Cast to `int*` and then dereference.
    free(arg); // Don't forget this!
    while(1){
        printf("I'm thread %d\n",i);
        waitInBarrier(&barrier);
    }
    return NULL;
}

1不要尝试(void*)&i直接传递给它,pthread_create因为不能保证*(int*)argfor循环中的增量之前将对它进行求值,因此i在读取其值之前,您可能会得到一些奇怪的行为,即更改了该行为

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

未经检查的强制转换警告和 ClassCastException

来自分类Dev

C#和强制转换通用参数

来自分类Dev

带有参数化类型的未经检查的强制转换警告

来自分类Dev

三元和强制转换为qsort参数

来自分类Dev

警告:传递'strcpy'的参数1会使指针从整数开始而无需强制转换

来自分类Dev

基于Class <>参数返回通用实现时未经检查的强制转换警告

来自分类Dev

传递sprintf的参数2会使指针从整数开始而无需强制转换。C警告

来自分类Dev

警告:传递'fopen'的参数2会使指针从整数开始而无需强制转换

来自分类Dev

警告:传递“memcpy”的参数 1 使指针从整数而不进行强制转换

来自分类Dev

未经检查的强制转换和带有lambda的不必要的禁止警告

来自分类Dev

将charAtIndex分配给stringWithCharacters会给出无效的强制转换警告和错误的访问错误

来自分类Dev

将charAtIndex分配给stringWithCharacters会给出无效的强制转换警告和错误的访问错误

来自分类Dev

来自整数的冲突类型错误和指针没有强制转换警告 C

来自分类Dev

参数警告和过载

来自分类Dev

警告:传递'uart1_sendchar'的参数1会使指针从整数开始而无需强制转换[默认启用]

来自分类Dev

qsort()和强制转换操作

来自分类Dev

强制转换和求和功能

来自分类Dev

泛型和强制转换

来自分类Dev

PLSQL赋值和强制转换

来自分类Dev

qsort()和强制转换操作

来自分类Dev

使用协方差和多个通用参数时强制转换为基本接口

来自分类Dev

转换为装箱语法需要强制转换UIBarMetrics警告

来自分类Dev

函数的强制参数和默认参数

来自分类Dev

Swift:强制转换关闭参数?

来自分类Dev

算术和强制转换指针和结构

来自分类Dev

Java泛型-强制转换为List <SomeType>会发出未经检查的强制转换警告,而不能强制转换为SomeType

来自分类Dev

强制转换为通用类型(T)会发出“未经检查的强制转换”警告

来自分类Dev

C语言中的强制转换警告:赋值使指针不进行强制转换而生成整数

来自分类Dev

使用泛型类型执行强制转换时的警告

Related 相关文章

  1. 1

    未经检查的强制转换警告和 ClassCastException

  2. 2

    C#和强制转换通用参数

  3. 3

    带有参数化类型的未经检查的强制转换警告

  4. 4

    三元和强制转换为qsort参数

  5. 5

    警告:传递'strcpy'的参数1会使指针从整数开始而无需强制转换

  6. 6

    基于Class <>参数返回通用实现时未经检查的强制转换警告

  7. 7

    传递sprintf的参数2会使指针从整数开始而无需强制转换。C警告

  8. 8

    警告:传递'fopen'的参数2会使指针从整数开始而无需强制转换

  9. 9

    警告:传递“memcpy”的参数 1 使指针从整数而不进行强制转换

  10. 10

    未经检查的强制转换和带有lambda的不必要的禁止警告

  11. 11

    将charAtIndex分配给stringWithCharacters会给出无效的强制转换警告和错误的访问错误

  12. 12

    将charAtIndex分配给stringWithCharacters会给出无效的强制转换警告和错误的访问错误

  13. 13

    来自整数的冲突类型错误和指针没有强制转换警告 C

  14. 14

    参数警告和过载

  15. 15

    警告:传递'uart1_sendchar'的参数1会使指针从整数开始而无需强制转换[默认启用]

  16. 16

    qsort()和强制转换操作

  17. 17

    强制转换和求和功能

  18. 18

    泛型和强制转换

  19. 19

    PLSQL赋值和强制转换

  20. 20

    qsort()和强制转换操作

  21. 21

    使用协方差和多个通用参数时强制转换为基本接口

  22. 22

    转换为装箱语法需要强制转换UIBarMetrics警告

  23. 23

    函数的强制参数和默认参数

  24. 24

    Swift:强制转换关闭参数?

  25. 25

    算术和强制转换指针和结构

  26. 26

    Java泛型-强制转换为List <SomeType>会发出未经检查的强制转换警告,而不能强制转换为SomeType

  27. 27

    强制转换为通用类型(T)会发出“未经检查的强制转换”警告

  28. 28

    C语言中的强制转换警告:赋值使指针不进行强制转换而生成整数

  29. 29

    使用泛型类型执行强制转换时的警告

热门标签

归档