我在将结构指针传递给函数时遇到了麻烦,因为我对这些指针和引用有点困惑。我想修改thread.thread_num
函数中的thread_start
值。
#include <stdio.h>
#include <stdlib.h> //malloc, free
#include <pthread.h>
#define N 5
// void *malloc(size_t);
struct thread {
pthread_t thread_id;
int thread_num;
// int thread_sum;
};
void *thread_start(void *thread)
{
struct thread *my_data;
my_data = (struct thread *)thread;
printf("num T: %i\n", my_data->thread_num);
my_data->thread_num=4;
printf("num T: %i\n", my_data->thread_num);
return NULL;
}
int main(int argc, char *argv[])
{
int i;
struct thread pthread_data;
struct thread *thread = &pthread_data;
thread->thread_num=2;
pthread_create(&thread->thread_id, NULL, thread_start, (void *)&thread);
printf("num: %i\n",thread->thread_num);
pthread_exit(NULL);
return 0;
}
但打印主要值的值不会改变(2)。
然后我想创建一个线程结构数组,但我不知道究竟是怎么做到的: 我想它应该是这样的:
int main(int argc, char *argv[])
{
int i;
struct thread pthread_data;
struct thread *thread[N-1] = &pthread_data; // I don't know how to manage this.
for(i=0; i<N; i++)
{
thread->thread_num=i;
pthread_create(&thread[i]->thread_id, NULL, thread_start, (void *)&thread[i]);
printf("num %i: %i\n",i,thread[i]->thread_num);
}
pthread_exit(NULL);
return 0;
}
有什么想法吗?
答案 0 :(得分:6)
我建议你阅读http://www.advancedlinuxprogramming.com/alp-folder/alp-ch04-threads.pdf
这就是你想要的:
#define N 5
typedef struct thread {
pthread_t thread_id;
int thread_num;
// int thread_sum;
} ThreadData;
void *thread_start(void *thread)
{
ThreadData *my_data = (ThreadData*)thread;
//there is no guarantee that prints will be in order
// we will use its initial thread->num ,cause it differs for each thread
//plus you will see how threads will behave
int order=my_data->thread_num;
printf("%i) before num T: %i\n",order, my_data->thread_num);
my_data->thread_num=4;
printf("%i) after assignment num T: %i\n",order ,my_data->thread_num);
return NULL;
}
int main(int argc, char *argv[])
{
int i;
ThreadData thread[N];
for(i=0; i<N; i++)
{
thread[i].thread_num=i;
pthread_create(&(thread[i].thread_id), NULL, thread_start, (void *)(thread+i));
}
//wait for all threads
for (i = 0; i < N; i++)
pthread_join(thread[i].thread_id, NULL);
//print results of each thread
for (i = 0; i < N; i++)
printf(" %i)thread: number %i\n",i,thread[i].thread_num);
return 0;
}
答案 1 :(得分:1)
我可以在你的代码中看到多个错误。
首先你的指针错了。在第一个示例中,将&pthread_data
传递给pthread_create
就足够了,&thread
是thread
指针的地址,因此您将struct thread **
传递给您功能而不是struct thread *
。在第二个示例中,您应该使用(void *) thread[i]
。 &thread[i]
又是struct thread **
。
当你希望每个线程都写入自己的线程数据时,你应该创建一个线程数据数组,这样每个线程都有自己的部分,否则你将遇到竞争条件。
正如其他人已经指出的那样,你应该在调用pthread_join
之前调用printf
以确保主线程将等待所有工作线程。
另请注意,如果从其他函数调用pthread_join
生成这些线程的函数,则必须确保胎面数据数组不会超出范围(在这种情况下可能会超出范围)最好使用malloc
或全局数组。)
答案 2 :(得分:0)
你做不到。只要main
退出(当您调用pthread_exit
时它就会执行),pthread_data
就会停止存在,因为它位于main
函数的本地。所以它无法修改。