我在使用C时遇到了一些麻烦。我是一个相对较新的程序员,我正在尝试创建一个结构并通过引用将其传递给两个线程。我想要一个线程将信息放入结构,另一个线程添加信息并打印出来。我正在谈论的伪代码如下:
typedef struct{ int x, y }addme;
main{
addme argstopass;
create_thread(method_store, (void*)&argstopass);
create_thread(method_calc, (void*)&argstopass);
//Code to tell store thread 'only' to run
//Code to tell calc thread to run when store is finished.
join_both_threads;
}
void method_store(void* args){
addme info = *((addme*)args);
info.a = 7;
info.b = 3;
}
void method_calc(void* args){
addme info = *((addme*)args);
print(info.a+info.b);
}
问题在于,当我尝试添加信息时,就像store方法从未更新过它一样。传递给线程的引用是相同的,所以我不明白为什么只要它们都有指向它的指针,它们就不能访问相同的信息。
希望这里有人可以告诉我我做错了什么。如果有什么不清楚,请评论,我会帮助澄清。
答案 0 :(得分:1)
addme info = *((addme*)args);
在堆栈上创建一个区域设置变量,并将argstopass
的内容复制到其中。修改仅发生在此局部变量上,因此第二个线程不会看到。
使用
addme *info = args;
info->a = 7;
并且第二个线程同上。您必须确保第二个线程等待其printf(),直到第一个线程修改了值。
答案 1 :(得分:0)
void method_store(void* args){
addme info = *((addme*)args);
info.a = 7;
info.b = 3;
}
此方法创建结构字段的本地副本,更新本地副本,然后返回,销毁副本而不对主结构执行任何操作。