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

时间:2014-10-30 17:11:18

标签: c++ multithreading function-pointers

我有一个通用方式的程序的两个部分

case-1 ---参考线程的静态全局变量

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 - 使用函数指针。无法理解Line-1与Line-2和Line-3与Line-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;
}

这里我能够以两种方式调用分配函数指针(Line-1和Line-2)并以两种方式调用函数指针(Line-3和Line) -4)即可。

只想知道上面例子中有什么不同。

提前致谢..

2 个答案:

答案 0 :(得分:0)

即使您按照评论员的建议正确调整了输出,您也不可能得到10和40。

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

这是数据不是线程安全的好例子,以及可能发生的有趣事情。

答案 1 :(得分:0)

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

除非它是sizeof或一元&运算符的操作数,否则函数指示符将转换为类型为&#34的表达式;指向返回T&的函数的指针#34 ;;它与数组表达式如何转换为指针表达式类似。