函数指针实现的两种方法之间的差异
Difference between two approaches of function pointer implementation
我有两个通用程序段
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
的函数指针"类型的表达式;这类似于数组表达式如何转换为指针表达式。
相关文章:
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 不同的类或结构初始化方法之间的性能差异是什么?
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 在C++事务之间存储大量字符数据的有效方法
- 定义类模板构造函数的两种方法之间的区别
- std::list 的两个 insert() 方法签名之间的实现差异
- 使瓷砖之间没有边框的最佳方法?
- 两个类之间的共享方法
- 在C++和Python之间交换数据的最快方法是什么?
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 在 c++ 中,在线程之间共享数据容器的最佳方法是什么?
- 获取字符串大小的各种方法之间的比较
- 在 C 中并行化嵌套循环的几种方法之间的差异,C++使用 OpenMP
- 在两个Raspberry Pis C 之间发送重复命令的方法
- 分流场算法C++方法之间未正确传递?
- 根据编译时条件在类型之间选择类型的惯用方法
- C++对象构造方法之间的差异
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 在QTcpSocket和python套接字之间交换数据的正确方法是什么?