首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两种函数指针实现方法的区别

两种函数指针实现方法的区别
EN

Stack Overflow用户
提问于 2014-10-30 17:11:18
回答 2查看 94关注 0票数 0

我有两部分程序是通用的。

引用线程的case-1---static全局变量

代码语言:javascript
复制
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行的用法的差异

代码语言:javascript
复制
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行)

我只想知道上面的例子有什么区别。

提前谢谢..。

EN

回答 2

Stack Overflow用户

发布于 2014-10-30 17:35:42

你不太可能得到10和40,即使你得到了正确的输出调整,如评论员的建议。

我是一个全局变量,所以当线程2启动时,它可以为i找到任何状态,很可能是30,因此它会向它再添加30,或者您可以让t1增量i到30,然后t2在t1到达t1语句之前再增加30。因此,t1可能打印60,t2可能打印60,也可能是意外的结果。

这是一个很好的例子,数据不是线程安全的,也是可能发生的有趣的事情。

票数 0
EN

Stack Overflow用户

发布于 2014-10-30 17:45:53

您在线程之间有一个竞争条件;没有同步来控制谁首先到达i。让两个线程都打印10是一个合理的结果。

除非是sizeof或一元&运算符的操作数,否则函数指示符将转换为类型为“指针到函数返回T”的表达式;它类似于数组表达式转换为指针表达式的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26659234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档