【发布时间】:2015-08-15 14:46:44
【问题描述】:
我想在 c 中运行 Pthreads。我很乐意在 c 中向 Pthread 发送整数值。但是当我将数据结构传递给线程时,它正在打印垃圾值。
我的代码如下:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUMBER_OF_THREADS 3
typedef struct MyStructure
{
int id;
char *myName;
}myst;
void *PrintHello(void *threadArgs)
{
myst *myPersonalSt;
myPersonalSt = (myst *) threadArgs;
printf("Thread %d and Name : %s \n", myPersonalSt->id ,
myPersonalSt->myName);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUMBER_OF_THREADS];
long taskids[NUMBER_OF_THREADS];
int rc, t;
char myNameArray[NUMBER_OF_THREADS][100] = {"kp" , "kkp" , "ap"};
myst **mystArray;
mystArray = (myst **)malloc(NUMBER_OF_THREADS*sizeof(myst));
for(t=0;t<NUMBER_OF_THREADS;t++)
{
mystArray[t] = (myst *)calloc(1,sizeof(myst));
mystArray[t]->id = t+1;
mystArray[t]->myName = myNameArray[t];
}
for(t=0;t<NUMBER_OF_THREADS;t++) {
printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) mystArray);
if (rc) {
printf("ERROR; return code from
pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t=0;t<NUMBER_OF_THREADS;t++) {
pthread_join(threads[t],NULL);
}
pthread_exit(NULL); // this takes an input parameter !
}
我认为这是 MALLOC 的问题(因为它不会初始化分配的内存)。所以我使用了 CALLOC ,但出现了同样的问题。
【问题讨论】:
-
不需要向
void *或从void *进行转换(printfs%p除外,您不使用它)。您可以删除所有演员表,尤其是malloc和calloc前面的演员表。 -
如果我删除演员并使用 %p ,它会给我这样的东西:** 创建线程 0 创建线程 1 线程 0x8582028 和名称:0x8582038 创建线程 2 线程 0x8582028 和名称:0x8582038 线程0x8582028 和名称:0x8582038 **
-
你不需要使用
%p,我有点迂腐。但是现在您可以看到您将相同的指针传递给每个线程。提示:您正在传递一个指向您的mystArray的指针,您的意思可能是mystArray[t]。 -
@KrunalParmar - 从现在开始,如果您可以减少代码并仅放置可以重现问题的相关代码部分,那就太好了
-
@amrith-krishna 先生,这只是为了我的练习和习惯于在 c 中穿线。所以我发布了代码。但从现在开始,我会处理好这件事。谢谢。
标签: c multithreading pthreads posix