我正在尝试pthread示例。这是我的代码:
#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);
}
我用这段代码编译:
gcc -lpthread ThreadDeneme.cpp
或
g++ -lpthread ThreadDeneme.cpp
错误说:
无法使用左值类型初始化类型为'int'的变量 'void'int bas = * gelen;
我用这个:
int bas =(int *)gelen;
但错误仍在进行中。
我看了:
答案 0 :(得分:5)
1)您不能取消引用void *
。所以,
int bas= *gelen;
无法运作。阅读int
的正确方法是:
int bas= *(int*)gelen;
2)但这也不会起作用。因为相同的地址i
被传递给所有4个线程,并且导致data race。因此,您需要将不同的地址传递给每个线程,以避免数据竞争(或使用某种形式的同步)。
3)你的线程函数AsalK1()
应该返回一个指针(参见pthread_create()对线程函数的要求)。
你可以简单地返回一个NULL指针,因为你没有从线程返回主线程。
4)另一个潜在的问题是如何编译:
gcc -lpthread ThreadDeneme.cpp
库应位于命令行选项的末尾。所以,你编译为:
gcc ThreadDeneme.cpp -lpthread
另一个相关的建议:你可以使用 array 而不是使用4个不同的线程id变量(th1..4
)。它允许使用循环来创建和连接线程,你也可以轻松地改变线程数。
答案 1 :(得分:1)
解决与错误消息相关的问题,您需要具有完整类型才能取消引用该错误消息。变化
int bas= *gelen;
到
int bas= *(int *)gelen;
FWIW,void
是一个不完整的类型,
void
类型包含一组空值;它是一个不完整的对象类型 无法完成。
对于C ++,引用C++14
,(强调我的)
一元
*
运算符执行间接:应用它的表达式应该是指向的表达式 对象类型或指向函数类型的指针,结果是引用对象或函数的左值 表达点所指向的。如果表达式的类型是“指向T的指针”,结果的类型是 “T。” [注意:通过指向不完整类型(除了cvvoid
)的指针间接有效。左值 如此获得的可以以有限的方式使用(例如,初始化参考);这个左值不能 转换为prvalue,]
答案 2 :(得分:1)
你必须使用
int bas= *(int *) gelen;
首先转换为int
类型的指针,然后使用*
取消引用它
答案 3 :(得分:1)
int bas= *gelen;
正如您在void * AsalK1(void * gelen)函数中看到的那样,gelen是无效指针 并且您必须根据您的情况将类型转换为有效的数据类型 因为bas是int数据类型所以要在int bas中存储所以gelen指针应该是intpecase到int *,如下所示
int bas= *(int *) gelen;
答案 4 :(得分:0)
您需要将其强制转换为int类型的指针。 printf中也有错误。
void *AsalK1(void *gelen){
int *bas= (int *) gelen;
printf("bas :%d\n",*bas);
}