当前位置: 技术问答>linux和unix
linux 多线程 问题 全局变量 共享问题,恳请赐教,帮助>>
来源: 互联网 发布时间:2016-05-23
本文导语: 大家好,对linux多线程一直以来有个疑问困扰着我,恳请帮助: 如下:在main()函数里有以下语句: #include #include int all = 0; // 全局变量all初始化为0; int main() { res=pthread_create( &a_thread , NULL ,...
大家好,对linux多线程一直以来有个疑问困扰着我,恳请帮助:
如下:在main()函数里有以下语句:
#include
#include
int all = 0; // 全局变量all初始化为0;
int main()
{
res=pthread_create( &a_thread , NULL , thread_function , NULL ); // 创建线程函数
...........
............. //执行其他操作
if( all == 23 )
{
printf( "normal, all is 23n" );
}
else if( all == 23 )
{
printf( "oh, It's not normaln" ); //正常情况下,应该不会执行这句话,但如果all为多线程共享的全局变量,会不会执行这句话呢?
}
}
/* 下面是线程函数 */
void * thread_function()
{
all = 23;
}
请问大家,上面程序 中else if 语句块里会不会执行而输出 oh, It's not normal
关于多线程,有个重要的概念是原子操作,请问if else 语句具备原子性吗? 就这两个问题,希望得到高人指点。。。。。谢谢。。。
如下:在main()函数里有以下语句:
#include
#include
int all = 0; // 全局变量all初始化为0;
int main()
{
res=pthread_create( &a_thread , NULL , thread_function , NULL ); // 创建线程函数
...........
............. //执行其他操作
if( all == 23 )
{
printf( "normal, all is 23n" );
}
else if( all == 23 )
{
printf( "oh, It's not normaln" ); //正常情况下,应该不会执行这句话,但如果all为多线程共享的全局变量,会不会执行这句话呢?
}
}
/* 下面是线程函数 */
void * thread_function()
{
all = 23;
}
请问大家,上面程序 中else if 语句块里会不会执行而输出 oh, It's not normal
关于多线程,有个重要的概念是原子操作,请问if else 语句具备原子性吗? 就这两个问题,希望得到高人指点。。。。。谢谢。。。
|
我觉得应该有可能。 加两个sleep应该可以看出来。
#include
#include
int all = 0; // 全局变量all初始化为0;
int main()
{
res=pthread_create( &a_thread , NULL , thread_function , NULL ); // 创建线程函数
...........
............. //执行其他操作
if( all == 23 )
{
printf( "normal, all is 23n" );
}
else if(!sleep(5) && all == 23 ) //保证执行了all=23的赋值语句后在执行到后面的比较。 {
printf( "oh, It's not normaln" ); //正常情况下,应该不会执行这句话,但如果all为多线程共享的全局变量,会不会执行这句话呢?
}
}
/* 下面是线程函数 */
void * thread_function()
{
sleep(2); ///保证先执行if( all == 23 ) 在执行下面的
all = 23;
}
#include
#include
int all = 0; // 全局变量all初始化为0;
int main()
{
res=pthread_create( &a_thread , NULL , thread_function , NULL ); // 创建线程函数
...........
............. //执行其他操作
if( all == 23 )
{
printf( "normal, all is 23n" );
}
else if(!sleep(5) && all == 23 ) //保证执行了all=23的赋值语句后在执行到后面的比较。 {
printf( "oh, It's not normaln" ); //正常情况下,应该不会执行这句话,但如果all为多线程共享的全局变量,会不会执行这句话呢?
}
}
/* 下面是线程函数 */
void * thread_function()
{
sleep(2); ///保证先执行if( all == 23 ) 在执行下面的
all = 23;
}
|
只要没用调用其他任何函数的操作就是原子操作啊。
至于你哪个if,else if,当然有可能的,if的时候 all != 23 ,而到else if的时候,变量被更改,很正常啊。
至于你哪个if,else if,当然有可能的,if的时候 all != 23 ,而到else if的时候,变量被更改,很正常啊。
|
if/else是原子操作,all == 23也是原子操作
但是两个原子操作加起来就不是原子操作了。
但是两个原子操作加起来就不是原子操作了。