关于多线程,全局变量,同步的问题?

时间:2021-03-27 18:09:57
有两个线程,一个主线程,一个辅助线程。
在主线程中定义了一个全局变量。
辅助线程只是取得全局变量的值。并没有却改变它。
而主线程会去改变全局变量的值。
在这种情况下,是不是可以不管同步问题。

我的理解是只要是全局变量的值只由一个线程来改变的话,其它线程只是访问。
那么可以不管同步。除非有一个以上的线程可能对全局变量的值进行了改变。

不知道明白了没有,不知道对不对??

8 个解决方案

#1


当你读取的值用于另一个线程的控制流时,同样要用到同步..

#2


对,
但是变量要用volatile修饰。

#3


需要同步,因为不排除一个线程在读取全局变量时,主线程正在改写该变量。

尽管这在单 CPU 的机器上永远不会发生(如果该全局变量不是 struct 或 class )。

如果所有线程都不该写该全局变量,则不要同步。

#4


同意楼上的,要同步

#5


我的变量只是一个长整型的数。
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随时会发生变化,
  不要对与他有关的代码做优化"。

#8


如果您明确要求,
线程要取的值是修改之后(之前)的值,
显然要有同步。
不过这时的同步要求,
并不是因这个变量而产生的,
而是您的程序运行逻辑的要求。

#1


当你读取的值用于另一个线程的控制流时,同样要用到同步..

#2


对,
但是变量要用volatile修饰。

#3


需要同步,因为不排除一个线程在读取全局变量时,主线程正在改写该变量。

尽管这在单 CPU 的机器上永远不会发生(如果该全局变量不是 struct 或 class )。

如果所有线程都不该写该全局变量,则不要同步。

#4


同意楼上的,要同步

#5


我的变量只是一个长整型的数。
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随时会发生变化,
  不要对与他有关的代码做优化"。

#8


如果您明确要求,
线程要取的值是修改之后(之前)的值,
显然要有同步。
不过这时的同步要求,
并不是因这个变量而产生的,
而是您的程序运行逻辑的要求。