我有一个通用方式的程序的两个部分
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)即可。
只想知道上面例子中有什么不同。
提前致谢..
答案 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 ;;它与数组表达式如何转换为指针表达式类似。