c 线程中的无效类型转换,void* 到 int
Invalid type conversion in c threads, void* to int
首先希望大家平安。我正在尝试传递一个数组,其中包含在 C 中创建的线程的 threadID。我知道该程序充满了错误,但我收到了一个我不知道如何解决的错误。在我写 threadID[i]=(int*)tid[i]; 的那一行我得到无效的类型转换。我在将 void* 转换为 int 时试图做什么,但我得到了那个错误。我在 C 方面很糟糕,但我正在努力学习。如果我能得到任何帮助,我将不胜感激
谢谢
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
int x=0;
void* printMsg(void *tid)
{
pthread_t id = pthread_self();
int nthreads;
//Get the number of threads
nthreads= sizeof(tid);
//Copy thread array from main to threadID array
int *threadID[nthreads];
;
for(int i=0;i<nthreads;i++)
threadID[i]=(int*)tid[i];
if(pthread_equal(id,threadID[x]))
{
printf("%d\n",x);
x++;
}
while(1);
}
int main()
{
int i=0;
int n=0;
printf("Enter number of threads : ");
scanf("%d",&n);
pthread_t tid[n];
for(i=0;i<n;i++)
{
pthread_create(&(tid[i]), NULL, &printMsg, (void*)tid);
}
for (i=0;i<n;i++)
{
pthread_join(tid[i], NULL);
}
sleep(5);
return 0;
}
理想的做法是让线程在创建时就知道它是哪个线程。您可以通过将线程 ID 作为参数传递来实现。您可以通过以下方式执行此操作:
void *printMsg(void *tnum_p) {
int tnum = *(int *)tnum_p;
printf("%d\n", tnum);
return NULL;
}
int main() {
int i = 0;
int n = 0;
printf("Enter number of threads: ");
scanf("%d", &n);
pthread_t tid[n];
int tnum[n];
for(i = 0; i < n; i++) {
tnum[i] = i;
pthread_create(&(tid[i]), NULL, &printMsg, &(tnum[i]));
}
for (i = 0; i < n; i++) {
pthread_join(tid[i], NULL);
}
return 0;
}
有人可能认为我们可以通过 &i
而不是 &(tnum[i])
;这将编译没有任何错误,但是每个线程都会收到相同的地址,这取决于每个线程在那里找到的运气和时间(即你几乎肯定有重复的数字)。
(我也更喜欢 tid + i
和 tnum + i
而不是 &(tid[i])
和 &(tnum[i])
,但这就是我。)
如果您需要发送任何其他信息,请制作一个 struct
来携带您需要的一切,而不是传递一个 int
。
首先希望大家平安。我正在尝试传递一个数组,其中包含在 C 中创建的线程的 threadID。我知道该程序充满了错误,但我收到了一个我不知道如何解决的错误。在我写 threadID[i]=(int*)tid[i]; 的那一行我得到无效的类型转换。我在将 void* 转换为 int 时试图做什么,但我得到了那个错误。我在 C 方面很糟糕,但我正在努力学习。如果我能得到任何帮助,我将不胜感激
谢谢
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
int x=0;
void* printMsg(void *tid)
{
pthread_t id = pthread_self();
int nthreads;
//Get the number of threads
nthreads= sizeof(tid);
//Copy thread array from main to threadID array
int *threadID[nthreads];
;
for(int i=0;i<nthreads;i++)
threadID[i]=(int*)tid[i];
if(pthread_equal(id,threadID[x]))
{
printf("%d\n",x);
x++;
}
while(1);
}
int main()
{
int i=0;
int n=0;
printf("Enter number of threads : ");
scanf("%d",&n);
pthread_t tid[n];
for(i=0;i<n;i++)
{
pthread_create(&(tid[i]), NULL, &printMsg, (void*)tid);
}
for (i=0;i<n;i++)
{
pthread_join(tid[i], NULL);
}
sleep(5);
return 0;
}
理想的做法是让线程在创建时就知道它是哪个线程。您可以通过将线程 ID 作为参数传递来实现。您可以通过以下方式执行此操作:
void *printMsg(void *tnum_p) {
int tnum = *(int *)tnum_p;
printf("%d\n", tnum);
return NULL;
}
int main() {
int i = 0;
int n = 0;
printf("Enter number of threads: ");
scanf("%d", &n);
pthread_t tid[n];
int tnum[n];
for(i = 0; i < n; i++) {
tnum[i] = i;
pthread_create(&(tid[i]), NULL, &printMsg, &(tnum[i]));
}
for (i = 0; i < n; i++) {
pthread_join(tid[i], NULL);
}
return 0;
}
有人可能认为我们可以通过 &i
而不是 &(tnum[i])
;这将编译没有任何错误,但是每个线程都会收到相同的地址,这取决于每个线程在那里找到的运气和时间(即你几乎肯定有重复的数字)。
(我也更喜欢 tid + i
和 tnum + i
而不是 &(tid[i])
和 &(tnum[i])
,但这就是我。)
如果您需要发送任何其他信息,请制作一个 struct
来携带您需要的一切,而不是传递一个 int
。