在主线程中定义了一个全局变量。
辅助线程只是取得全局变量的值。并没有却改变它。
而主线程会去改变全局变量的值。
在这种情况下,是不是可以不管同步问题。
我的理解是只要是全局变量的值只由一个线程来改变的话,其它线程只是访问。
那么可以不管同步。除非有一个以上的线程可能对全局变量的值进行了改变。
不知道明白了没有,不知道对不对??
8 个解决方案
#1
当你读取的值用于另一个线程的控制流时,同样要用到同步..
#2
对,
但是变量要用volatile修饰。
但是变量要用volatile修饰。
#3
需要同步,因为不排除一个线程在读取全局变量时,主线程正在改写该变量。
尽管这在单 CPU 的机器上永远不会发生(如果该全局变量不是 struct 或 class )。
如果所有线程都不该写该全局变量,则不要同步。
尽管这在单 CPU 的机器上永远不会发生(如果该全局变量不是 struct 或 class )。
如果所有线程都不该写该全局变量,则不要同步。
#4
同意楼上的,要同步
#5
我的变量只是一个长整型的数。
In355Hz:
需要同步,因为不排除一个线程在读取全局变量时,主线程正在改写该变量。
尽管这在单 CPU 的机器上永远不会发生。
我的可是单CPU,也就是可以不要同步了。
众说纷纭,也不知道哪位仁兄说的对?
In355Hz:
需要同步,因为不排除一个线程在读取全局变量时,主线程正在改写该变量。
尽管这在单 CPU 的机器上永远不会发生。
我的可是单CPU,也就是可以不要同步了。
众说纷纭,也不知道哪位仁兄说的对?
#6
我已经加分了,能不能说的详细一点。或是给点什么资料之类的。
#7
1.同步问题
期望两个线程运行后 flag=1
volatile int flag=1;
线程1
<1.1> int x=flag;
<1.2> x++;
<1.3> flag=x;
线程2
<2.1> int y=flag;
<2.2> y--;
<2.3> flag=y;
实际运行可能是:
<1.1> x=flag; //flag=1 x=1
<1.2> x++; //flag=1 x=2
<2.1> y=flag; //flag=1 y=1
<2.2> y--; //flag=1 y=0
<1.3> flag=x; //flag=2 x=2
<2.3> flag=y; //flag=0 y=0
这就是同步问题,如果只有一个线程改变变量的值,
则不存在同步问题
2.优化问题
期望在线程2启动后,线程1终止
int flag=1;
线程1
int x;
do
{
x=flag;
}while(x);
线程2
flag=0;
问题:
编译器发现flag在do-while循环中未被改变,于是优化成
int x;
x=flag;
do
{
}while(x);
就发生错误,在变量前加上修饰
volatile int flag=1;
就是告诉编译器:"flag随时会发生变化,
不要对与他有关的代码做优化"。
期望两个线程运行后 flag=1
volatile int flag=1;
线程1
<1.1> int x=flag;
<1.2> x++;
<1.3> flag=x;
线程2
<2.1> int y=flag;
<2.2> y--;
<2.3> flag=y;
实际运行可能是:
<1.1> x=flag; //flag=1 x=1
<1.2> x++; //flag=1 x=2
<2.1> y=flag; //flag=1 y=1
<2.2> y--; //flag=1 y=0
<1.3> flag=x; //flag=2 x=2
<2.3> flag=y; //flag=0 y=0
这就是同步问题,如果只有一个线程改变变量的值,
则不存在同步问题
2.优化问题
期望在线程2启动后,线程1终止
int flag=1;
线程1
int x;
do
{
x=flag;
}while(x);
线程2
flag=0;
问题:
编译器发现flag在do-while循环中未被改变,于是优化成
int x;
x=flag;
do
{
}while(x);
就发生错误,在变量前加上修饰
volatile int flag=1;
就是告诉编译器:"flag随时会发生变化,
不要对与他有关的代码做优化"。
#8
如果您明确要求,
线程要取的值是修改之后(之前)的值,
显然要有同步。
不过这时的同步要求,
并不是因这个变量而产生的,
而是您的程序运行逻辑的要求。
线程要取的值是修改之后(之前)的值,
显然要有同步。
不过这时的同步要求,
并不是因这个变量而产生的,
而是您的程序运行逻辑的要求。
#1
当你读取的值用于另一个线程的控制流时,同样要用到同步..
#2
对,
但是变量要用volatile修饰。
但是变量要用volatile修饰。
#3
需要同步,因为不排除一个线程在读取全局变量时,主线程正在改写该变量。
尽管这在单 CPU 的机器上永远不会发生(如果该全局变量不是 struct 或 class )。
如果所有线程都不该写该全局变量,则不要同步。
尽管这在单 CPU 的机器上永远不会发生(如果该全局变量不是 struct 或 class )。
如果所有线程都不该写该全局变量,则不要同步。
#4
同意楼上的,要同步
#5
我的变量只是一个长整型的数。
In355Hz:
需要同步,因为不排除一个线程在读取全局变量时,主线程正在改写该变量。
尽管这在单 CPU 的机器上永远不会发生。
我的可是单CPU,也就是可以不要同步了。
众说纷纭,也不知道哪位仁兄说的对?
In355Hz:
需要同步,因为不排除一个线程在读取全局变量时,主线程正在改写该变量。
尽管这在单 CPU 的机器上永远不会发生。
我的可是单CPU,也就是可以不要同步了。
众说纷纭,也不知道哪位仁兄说的对?
#6
我已经加分了,能不能说的详细一点。或是给点什么资料之类的。
#7
1.同步问题
期望两个线程运行后 flag=1
volatile int flag=1;
线程1
<1.1> int x=flag;
<1.2> x++;
<1.3> flag=x;
线程2
<2.1> int y=flag;
<2.2> y--;
<2.3> flag=y;
实际运行可能是:
<1.1> x=flag; //flag=1 x=1
<1.2> x++; //flag=1 x=2
<2.1> y=flag; //flag=1 y=1
<2.2> y--; //flag=1 y=0
<1.3> flag=x; //flag=2 x=2
<2.3> flag=y; //flag=0 y=0
这就是同步问题,如果只有一个线程改变变量的值,
则不存在同步问题
2.优化问题
期望在线程2启动后,线程1终止
int flag=1;
线程1
int x;
do
{
x=flag;
}while(x);
线程2
flag=0;
问题:
编译器发现flag在do-while循环中未被改变,于是优化成
int x;
x=flag;
do
{
}while(x);
就发生错误,在变量前加上修饰
volatile int flag=1;
就是告诉编译器:"flag随时会发生变化,
不要对与他有关的代码做优化"。
期望两个线程运行后 flag=1
volatile int flag=1;
线程1
<1.1> int x=flag;
<1.2> x++;
<1.3> flag=x;
线程2
<2.1> int y=flag;
<2.2> y--;
<2.3> flag=y;
实际运行可能是:
<1.1> x=flag; //flag=1 x=1
<1.2> x++; //flag=1 x=2
<2.1> y=flag; //flag=1 y=1
<2.2> y--; //flag=1 y=0
<1.3> flag=x; //flag=2 x=2
<2.3> flag=y; //flag=0 y=0
这就是同步问题,如果只有一个线程改变变量的值,
则不存在同步问题
2.优化问题
期望在线程2启动后,线程1终止
int flag=1;
线程1
int x;
do
{
x=flag;
}while(x);
线程2
flag=0;
问题:
编译器发现flag在do-while循环中未被改变,于是优化成
int x;
x=flag;
do
{
}while(x);
就发生错误,在变量前加上修饰
volatile int flag=1;
就是告诉编译器:"flag随时会发生变化,
不要对与他有关的代码做优化"。
#8
如果您明确要求,
线程要取的值是修改之后(之前)的值,
显然要有同步。
不过这时的同步要求,
并不是因这个变量而产生的,
而是您的程序运行逻辑的要求。
线程要取的值是修改之后(之前)的值,
显然要有同步。
不过这时的同步要求,
并不是因这个变量而产生的,
而是您的程序运行逻辑的要求。