I am trying pthread example. Here is my code:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void*AsalK1(void *gelen);
int main(){
int *i;
i= new int;
*i=1;
int sonSayi;
pthread_t th1, th2, th3, th4;
printf("---------------------------------------------\n");
printf("| Threadler ile Asal Sayi Bulma |\n");
printf("---------------------------------------------\n");
printf("Son sayi degeri: 1000000 \n");
int r1=pthread_create( &th1, NULL, AsalK1, (void *)i);
*i=3;
int r2=pthread_create( &th2, NULL, AsalK1, (void *)i);
*i=5;
int r3=pthread_create( &th3, NULL, AsalK1, (void *)i);
*i=7;
int r4=pthread_create( &th4, NULL, AsalK1, (void *)i);
pthread_join( th1, NULL);
pthread_join( th2, NULL);
pthread_join( th3, NULL);
pthread_join( th4, NULL);
return 0;
}
void *AsalK1(void *gelen){
int bas= *gelen;
printf("bas :&d\n",bas);
}
and i use this code to compile :
gcc -lpthread ThreadDeneme.cpp
or
g++ -lpthread ThreadDeneme.cpp
And the Error Says:
cannot initialize a variable of type 'int' with an lvalue of type 'void' int bas= *gelen;
I use this:
int bas= (int *) gelen;
but error still in progress.
I read:
What is the difference between these uses of pointers?
1) You are not allowed to dereference a void *. So,
int bas= *gelen;
isn't going to work. The correct way to read the int is:
int bas= *(int*)gelen;
2) But this isn't going to work either. Because the same address i is passed to all the 4 threads and that results in data race. So, you need to pass different address to each thread in order to avoid data race (or use some form of synchronization).
3) Your thread function AsalK1() should return a pointer (See pthread_create()'s requirement for the thread function).
You can simply return a NULL pointer since you are not returning anything from the thread to main thread.
4) Another potential problem is how you compile:
gcc -lpthread ThreadDeneme.cpp
The library should be at the end of the commandline option. So, you compile as:
gcc ThreadDeneme.cpp -lpthread
Another related suggestion: you can use array instead of using 4 different thread id variables (th1..4). It would allow to use a loop for thread creation and joining and you can easily change the number of threads as well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With