这是我的代码:
pthread_t client_thread1, client_thread2;
int *child_thread_data = new int;
pthread_mutex_t testlock;
typedef struct
{
int thread_no;
char thread_name[100];
} thrdata;
int main()
{
void *ret_data1 = new
int[10];
void *ret_data2 = new
int[10];
thrdata thr1;
thrdata thr2;
thr1.thread_no = 10;
strcpy((thr1.thread_name), "thread one");
thr2.thread_no = 20;
strcpy((thr2.thread_name), "thread two");
pthread_create(&client_thread1, &attr, &client_handler, &thr1);
pthread_create(&client_thread2, &attr, &client_handler, &thr2);
cout << "value of ret_data1 before thread 1 join " << *(int *) ret_data1
<< endl;
cout << "value of ret_data2 before thread 2 join " << *(int *) ret_data2
<< endl;
pthread_join(client_thread1, &ret_data1);
cout << "value returned by thread1 is " << *(int *) ret_data1 << endl;
pthread_join(client_thread2, &ret_data2);
cout << "value returned by thread2 is " << *(int *) ret_data2 << endl;
return 0;
}
void *client_handler(void *arg)
{
pthread_mutex_lock(&testlock);
thrdata *client_thd;
client_thd = (thrdata *) arg;
cout << "inside client_handler value of private data no is \n"
<< client_thd->thread_no << endl;
cout << "inside client_handler value of private data name is \n"
<< client_thd->thread_name << endl;
if (pthread_equal(client_thread1, pthread_self()))
{
*child_thread_data = 100;
pthread_mutex_unlock(&testlock);
pthread_exit((void *) &child_thread_data);
}
else if (pthread_equal(client_thread2, pthread_self()))
{
*child_thread_data = 200;
pthread_mutex_unlock(&testlock);
pthread_exit((void *) &child_thread_data);
}
}
输出:
value of ret_data1 before thread 1 join 0
value of ret_data2 before thread 2 join 0
inside client_handler value of private data no is 20
inside client_handler value of private data name is thread two
calling pthread_exit of thread2 and value of child_thread_data is 200
inside client_handler value of private data no is 10
inside client_handler value of private data name is thread one
calling pthread_exit of thread1 and value of child_thread_data is 100
value returned by thread1 is 28262416
value returned by thread2 is 28262416
为什么两个子线程返回相同的数据?我在pthread_exit(28262416)中设置了不同的数据,但在这两种情况下我仍然收到相同的数据。请让我知道原因。
感谢。
答案 0 :(得分:2)
我看到两个问题:首先两个线程都修改并返回相同的指针。
其次,线程将指针返回给指针(例如int **
)。
第一个问题只会给你相同的结果(但与你现在得到的结果无关)。第二个问题是为您提供现在获得的结果(这是变量child_thread_data
在内存中的位置)。
要修复这两个问题,首先需要两个值来分配和返回,并返回一个指针(int *
)。
哦,锁定并不重要,因为最后一个运行的线程总是会覆盖结果。
你也有内存泄漏,你分配内存并分配给ret_data1
和ret_data2
然后你只需在pthread_join
覆盖这些指针时丢弃该内存。
我的大建议是你回过头几步,find a good book about C并重新开始讨论指针。并且还尝试了解何时何地应该使用指针。因为现在你在不需要时使用指针(例如,不需要child_thread_data
作为指针)。