尝试创建线程时从'void *(*)(int(*)[2])'无效转换为'void *(*)(void *)

doctopus

我有一个函数,它接收一对管道文件描述符,从一个管道中读取数字,对它们进行排序,然后通过第二个管道写回父对象:

void *sort_chunk(int fds[][2]) {
    close(fds[DOWN][WRITE]);
    FILE* fddr = fdopen(fds[DOWN][READ], "r");
    char str[25];
    vector<long int> nums;

    // Read from parent and sort
    while (fgets(str, 20, fddr)) {
        string fstr = string(str);
        fstr.erase(fstr.length() - 1); // Remove trailing line return
        nums.push_back(stol(fstr));
    }
    fclose(fddr);

    bubblesort(nums);

    // Write back to parent
    close(fds[UP][READ]);
    FILE* fduw = fdopen(fds[UP][WRITE], "w");
    for (auto it = nums.begin(); it != nums.end(); it++) {
        fprintf(fduw, "%ld\n", *it);
    }
    fclose(fduw);
    exit(0);
}

我想在多个子线程中运行此函数:

int fds[2][2];
pipe(fds[DOWN]);
pipe(fds[UP]);
pthread_create(&threads[i], NULL, sort_chunk, fds);

当我尝试创建线程时,我得到:

mysort.cc:139:38: error: invalid conversion from ‘void* (*)(int (*)[2])’ to ‘void* (*)(void*)’ [-fpermissive]
  139 |    pthread_create(&threads[i], NULL, sort_chunk, fds);
      |                                      ^~~~~~~~~~
      |                                      |
      |                                      void* (*)(int (*)[2])
克里斯·多德

您需要修复线程函数以匹配pthread_create期望的原型:

void *sort_chunk(void *fds_) {
    int (*fds)[2] = fds_;   // works for C -- need an explicit cast for C++

基本问题是pthread_create期望一种带有单个void *参数的特定类型的函数指针,因此您不能以其他任何方式安全地调用它。

这在C语言中效果很好,但是在C ++中,您需要一个显式static_cast的函数,这很丑陋。但是对于C ++,您可能仍然应该使用std :: thread。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

错误:从'int(*)(void *)'到'void *(*)(void *)'的无效转换

来自分类Dev

错误:从'void *'到'int(*)(const void *,const void *)'的无效转换

来自分类Dev

将int转换为void *

来自分类Dev

无法将参数'2'的'int(Scheduler :: *)(int,void *)'转换为'int(*)(int,void *)'到'bool irq_InstallISR(int,int(*)(int,void *),无效*)'

来自分类Dev

如何将“ void(MyClass :: *)(int)”转换为“ void(*)(int)”?

来自分类Dev

将void(__ cdecl MyClass :: *)()转换为void *时出错

来自分类Dev

将void(__ cdecl MyClass :: *)()转换为void *时出错

来自分类Dev

将void *转换为int并返回

来自分类Dev

将int函数转换为void *

来自分类Dev

从(void **)转换为(int *),反之亦然

来自分类Dev

将void *转换为int并返回

来自分类Dev

无法将'void(MyClass :: *)()'转换为'void(*)()

来自分类Dev

将std :: function <void()>转换为void(*)()

来自分类Dev

将 void (*)() 转换为 void (*)(unsigned char)

来自分类Dev

C:将void(*)(void *)转换为void(*)(char *)

来自分类Dev

来自'void *-转换的无效转换

来自分类Dev

qsort给出[错误]:从'int(*)(cricketer *,cricketer *)'到'int(*)(const void *,const void *)'的无效转换

来自分类Dev

从'GLvoid(*)(){aka void(*)()}'到'void(__attribute __((__ cdecl__))*)(int)的无效转换

来自分类Dev

void(int)和void(*)(int)之间的区别

来自分类Dev

无法从pthread中的void *(类名)(void *)类型转换为void *(*)(void *)类型

来自分类Dev

无法从char *转换为void **

来自分类Dev

转换 void* 缓冲区时无效使用 void 表达式

来自分类Dev

从Foo **到void **的无效转换-为什么允许隐式类型转换为void *但不允许为void **?

来自分类Dev

从Foo **到void **的无效转换-为什么允许隐式类型转换为void *但不允许为void **?

来自分类Dev

C / C ++将void *强制转换为int(*())(int,...);

来自分类Dev

检查 int 是否在范围内时无法将 void 转换为 int

来自分类Dev

在OpenCL clCreateContext中从void(*)(...)到void(*)(...)的无效转换

来自分类Dev

将 void* 转换为任何内容的无效结果

来自分类Dev

错误类型转换void指针到int

Related 相关文章

  1. 1

    错误:从'int(*)(void *)'到'void *(*)(void *)'的无效转换

  2. 2

    错误:从'void *'到'int(*)(const void *,const void *)'的无效转换

  3. 3

    将int转换为void *

  4. 4

    无法将参数'2'的'int(Scheduler :: *)(int,void *)'转换为'int(*)(int,void *)'到'bool irq_InstallISR(int,int(*)(int,void *),无效*)'

  5. 5

    如何将“ void(MyClass :: *)(int)”转换为“ void(*)(int)”?

  6. 6

    将void(__ cdecl MyClass :: *)()转换为void *时出错

  7. 7

    将void(__ cdecl MyClass :: *)()转换为void *时出错

  8. 8

    将void *转换为int并返回

  9. 9

    将int函数转换为void *

  10. 10

    从(void **)转换为(int *),反之亦然

  11. 11

    将void *转换为int并返回

  12. 12

    无法将'void(MyClass :: *)()'转换为'void(*)()

  13. 13

    将std :: function <void()>转换为void(*)()

  14. 14

    将 void (*)() 转换为 void (*)(unsigned char)

  15. 15

    C:将void(*)(void *)转换为void(*)(char *)

  16. 16

    来自'void *-转换的无效转换

  17. 17

    qsort给出[错误]:从'int(*)(cricketer *,cricketer *)'到'int(*)(const void *,const void *)'的无效转换

  18. 18

    从'GLvoid(*)(){aka void(*)()}'到'void(__attribute __((__ cdecl__))*)(int)的无效转换

  19. 19

    void(int)和void(*)(int)之间的区别

  20. 20

    无法从pthread中的void *(类名)(void *)类型转换为void *(*)(void *)类型

  21. 21

    无法从char *转换为void **

  22. 22

    转换 void* 缓冲区时无效使用 void 表达式

  23. 23

    从Foo **到void **的无效转换-为什么允许隐式类型转换为void *但不允许为void **?

  24. 24

    从Foo **到void **的无效转换-为什么允许隐式类型转换为void *但不允许为void **?

  25. 25

    C / C ++将void *强制转换为int(*())(int,...);

  26. 26

    检查 int 是否在范围内时无法将 void 转换为 int

  27. 27

    在OpenCL clCreateContext中从void(*)(...)到void(*)(...)的无效转换

  28. 28

    将 void* 转换为任何内容的无效结果

  29. 29

    错误类型转换void指针到int

热门标签

归档