如何投放的整数空指针? [英] How to cast an integer to void pointer?
问题描述
虽然使用线程在C工作,我面对的警告
While working with Threads in C, I'm facing the warning
警告:强制转换为指针,从大小不同的整数
"warning: cast to pointer from integer of different size"
在code是如下:
#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);
}
任何人可以解释如何整数传递给接收(无效*)作为参数的函数吗?
Can anybody explain how to pass an integer to a function which receives (void * ) as a parameter?
推荐答案
这是通过整数新pthreads的,如果这是你所需要的罚款方式。你只需要燮preSS的警告,这将做到这一点:
This is a fine way to pass integers to new pthreads, if that is what you need. You just need to suppress the warning, and this will do it:
#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);
讨论
这可能会冒犯你的感情,但它的很短的,没有竞争条件(如,如果你使用你不得不&放大器;我
)。以书面形式额外的code几十行没有任何意义只是为了得到一堆编号线程。
Discussion
This may offend your sensibilities, but it's very short and has no race conditions (as you'd have if you used &i
). No sense in writing a few dozen lines of extra code just to get a bunch of numbered threads.
下面是一个坏版本数据争:
Here is a bad version with a data race:
#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;
}
现在,什么,当我与线程Sanitizer运行它发生?
Now, what happens when I run it with the thread sanitizer?
(此外,检查出它是如何打印出5两次......)
(Also, check out how it prints "5" twice...)
==================
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
这篇关于如何投放的整数空指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!