c - 如何将整数转换为 void 指针?

标签 c casting void-pointers

在使用 C 中的线程时,我遇到了警告

“警告:从不同大小的整数转换为指针”

代码如下

#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<pthread.h>
void *print(void *id)
{
 int a=10;
 printf("My thread id is %ld\n",pthread_self());
 printf("Thread %d is executing\n",id);
 return (void *) 42;
}

int main()
{
 pthread_t th[5];
 int t;
 int i;
 int status;
 void *ret;
 for(i=0;i<5;i++)
 {
   status=pthread_create(&th[i],NULL,print,(void *)i); //Getting warning at this line
   if(status)
   {
    printf("Error creating threads\n");
    exit(0);
   }
   pthread_join(th[i],&ret);
   printf("--->%d\n",(int *)ret);
 }
 pthread_exit(NULL);
}

谁能解释如何将整数传递给接收 (void * ) 作为参数的函数?

最佳答案

如果您需要的话,这是将整数传递给新 pthread 的好方法。你只需要抑制警告,这就可以了:

#include <stdint.h>

void *threadfunc(void *param)
{
    int id = (intptr_t) param;
    ...
}

int i, r;
r = pthread_create(&thread, NULL, threadfunc, (void *) (intptr_t) i);

讨论

这可能会冒犯您的敏感度,但它非常短并且没有竞争条件(如果您使用 &i 就会有)。仅仅为了获得一堆编号的线程而编写几十行额外的代码是没有意义的。

数据竞赛

这是一个带有数据竞争的版本:

#include <pthread.h>
#include <stdio.h>

#define N 10

void *thread_func(void *arg)
{
    int *ptr = arg;
    // Has *ptr changed by the time we get here?  Maybe!
    printf("Arg = %d\n", *ptr);
    return NULL;
}

int main()
{
    int i;
    pthread_t threads[N];
    for (i = 0; i < N; i++) {
        // NO NO NO NO this is bad!
        pthread_create(&threads[i], NULL, thread_func, &i);
    }
    for (i = 0; i < N; i++) {
        pthread_join(threads[i], NULL);
    }
    return 0;
}

现在,当我使用线程清理器运行它时会发生什么?

(另外,看看它是如何打印“5”两次的……)

==================
WARNING: ThreadSanitizer: data race (pid=20494)
  Read of size 4 at 0x7ffc95a834ec by thread T1:
    #0 thread_func /home/depp/test.c:9 (a.out+0x000000000a8c)
    #1 <null> <null> (libtsan.so.0+0x000000023519)

  Previous write of size 4 at 0x7ffc95a834ec by main thread:
    #0 main /home/depp/test.c:17 (a.out+0x000000000b3a)

  Location is stack of main thread.

  Thread T1 (tid=20496, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x0000000273d4)
    #1 main /home/depp/test.c:18 (a.out+0x000000000b1c)

SUMMARY: ThreadSanitizer: data race /home/depp/test.c:9 thread_func
==================
Arg = 1
Arg = 2
Arg = 3
Arg = 4
Arg = 5
Arg = 6
Arg = 7
Arg = 8
Arg = 9
Arg = 5
ThreadSanitizer: reported 1 warnings

关于c - 如何将整数转换为 void 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37810763/

相关文章:

java - Swift 中的 Java Object 等价物是什么?

c - 函数指针返回值的问题

c - 如何从给定文件 C 中删除 '#' 符号

c - 从 xml 文件中读取内容并存储在数组中

c - 编译包含<math.h>的c代码时需要使用额外的选项

c - 在 C (GCC) 中使用 char *

C:通过在函数中转换 void 指针来声明不同的类型

c++ - 知道为什么下面的代码片段打印 2 而不是 3

java - 未经检查的 Actor 问题

java - 如何使用Java中子类的Class实例对象将对象转换为其自身的子类?