我有两部分程序是通用的。
引用线程的case-1---static全局变量
static int i=10;
void fun1()
{
cout<<"fun1 i="<<i<<endl;
i=i+20;
}
void fun2()
{
cout<<"fun2 i="<<i<<endl;
i=i+30;
}
int main()
{
pthread_t t1,t2;
void *v;
pthread_create(&t1,NULL,(void *(*)(void *))fun1,NULL);
pthread_create(&t2,NULL,(void *(*)(void *))fun2,NULL);
pthread_join(t1,&v);
pthread_join(t2,&v);
}我希望在这里得到10和40的输出,但是输出是10和10。我只想知道怎样才能得到想要的输出。
case-2--函数指针的使用。无法理解第1行对第2行和第3行对第4行的用法的差异
void add()
{
cout<<"add"<<endl;
}
void sub()
{
cout<<"sub"<<endl;
}
int main()
{
void (*p)();
p=add; --Line-1
p=&add; --Line-2
(*p)(); --Line-3
p(); --Line-4
return 0;
}在这里,我可以用两种方式调用,分配函数指针(第1行和第2行),并以两种方式调用函数指针(第3行和第4行)。
我只想知道上面的例子有什么区别。
提前谢谢..。
发布于 2014-10-30 17:35:42
你不太可能得到10和40,即使你得到了正确的输出调整,如评论员的建议。
我是一个全局变量,所以当线程2启动时,它可以为i找到任何状态,很可能是30,因此它会向它再添加30,或者您可以让t1增量i到30,然后t2在t1到达t1语句之前再增加30。因此,t1可能打印60,t2可能打印60,也可能是意外的结果。
这是一个很好的例子,数据不是线程安全的,也是可能发生的有趣的事情。
发布于 2014-10-30 17:45:53
您在线程之间有一个竞争条件;没有同步来控制谁首先到达i。让两个线程都打印10是一个合理的结果。
除非是sizeof或一元&运算符的操作数,否则函数指示符将转换为类型为“指针到函数返回T”的表达式;它类似于数组表达式转换为指针表达式的方式。
https://stackoverflow.com/questions/26659234
复制相似问题