How to cast an integer to void pointer?
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);
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.
Data races
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;
}
Now, what happens when I run it with the thread sanitizer?
(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
Dinesh
The more I learn, the more I realize how much I don't know. #SOreadytohelp
Updated on May 06, 2020Comments
-
Dinesh about 4 years
While working with Threads in C, I'm facing the warning
"warning: cast to pointer from integer of different size"
The code is as follows
#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?