函数指针实现的两种方法之间的差异

Difference between two approaches of function pointer implementation

本文关键字:之间 方法 两种 指针 实现 函数      更新时间:2023-10-16

我有两个通用程序段

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——函数指针的使用。无法理解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行)调用函数指针

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

提前谢谢。。

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

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

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

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

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