English 中文(简体)
同步――微妙问题
原标题:thread synchronization - delicate issue

允许:

static a;
for (static int i=0; i<10; i++)
{
   a++;
   ///// point A
}

......

i m not sure about something.... what will happen in case thread1 gets into POINT A , stay there, while THREAD2 gets into the loop 10 times, but after the 10 th loop after incrementing i s value to 10, before checking i s value if it s less then 10, Thread1 is getting out of the loop and suppose to increment i and get into the loop again. what s the value that Thread1 will increment (which i will he see) ? will it be 10 or 0 ?

Thread1的种植面积将增至1,而后2的种植面积将再增加9倍(可能为8,7,等等)。

感谢

最佳回答

你们必须认识到,扩大行动实际上就是:

read the value
add 1
write the value back

你们必须问一下,如果其中两条是在两个独立广场同时发生的:

static int a = 0;

thread 1 reads a (0)
adds 1 (value is 1)
thread 2 reads a (0)
adds 1 (value is 1)
thread 1 writes (1)
thread 2 writes (1)

对于两个同时出现的加点,你可以看到,其中一项可能因为两条read子都读到预加价值而丢失。

The example you gave is complicated by the static loop index, which I didn t notice at first. Since this is c++ code, standard implementation is that the static variables are visible to all threads, thus there is only one loop counting variable for all threads. The sane thing to do would be to use a normal auto variable, because each thread would have its own, no locking required.

这意味着,虽然你有时会失去休养,但你也可能会获得这些补偿,因为 lo本身可能失去价值,而且会带来额外的时间。 总的来说,一个不做的事情的伟大例子。

问题回答

如果i在多个校对之间共享,所有床位均在外。 可以在另一个可怕的处决期间(包括通过该透镜的加固作业的中途)根本上随时添加<代码>i。 对上述法典中<代码>i的内容没有有意义的理由。 不要这样做。 要么向每一方提供自己的<代码>i的复印件,要么与10件单一原子操作做增量和比较。

这不是一个棘手的问题,因为如果协调成为一个问题,你就永远不会允许在真正的法典中这样做。

在座右边仅使用<代码>i++:

for (static int i=0; i<10; i++)
{
}

由于它具有杂质<代码>a。 (说明:static 这里非常奇怪。

考虑 A在达到<代码>i++时暂停使用。 表格B:i 直至9年的所有途径均载于<代码>。 i++。 如果要走下去,就会出现 lo。 页: 1 因此,它继续停下来:增删i! 因此,<条码>i成为11条, lo已bor。

任何时间校对共享数据都需要保护。 如果你的平台支持的话,你还可以使<代码>i++和i <10发生原子(随时中断)。

因此,在多面的环境中,我们渴望使用锁。

阁下:

bool test_increment(int& i)
{
  lock()
  ++i;
  bool result = i < 10;
  unlock();
  return result;
}

static a;
for(static int i = -1 ; test_increment(i) ; )
{
   ++a;
   // Point A
}

现在问题消失了。 请注意:lock(>unlock(>>)应当锁定并锁定所有试图上网的路面的通向。

是的,要么看管,要么可以做大部分工作。 但正如Dynite所解释的那样,这(而且应该)永远不会体现在真正的法典中。 如果协调是一个问题,你应提供相互排斥( Boo、read或Windows Thread)的办法,以防止种族条件如此。

为什么你们会使用静态的排泄物?

这象家务劳动,也是一件坏事。

这两条镜头都有自己的复印件,因此,行为完全可以发生。 这是造成这一问题的部分原因。

当你使用直截面或关键部分时,透镜一般会yn,但如果变数不变,甚至根本无法保证。

无疑,有人会指出,“无能为力”在多管区毫无用处,但人们却说有很多 st。 你们不必有变幻莫测,但对一些事情来说是有助益的。

如果您的“int”不是原子机体字体大小(思考64 bit Address + 包含32-bit VM的数据),你将“word-tear”。 在此情况下,你的“int”是32个轨道,但机器原住64个轨道。 现在,你们必须读到所有64个,增加一半,并发回。

这是一个大得多的问题;如果你真的想要了解情况,就放弃了处理器的指令,并 gr了如何在任何地方执行“游戏”。

增加“挥发性”,看机代码如何变化。 如果你没有发现芯片登记册,请使用增强图书馆并与之合作。

如果你需要同时增加具有多面透镜的价值,那么就研究“天文学行动”。 次要,研究“原子运行”。 大多数平台都有硬件支持,以原样加固、增加、比较和互换。 LOCines WOULD BE ÜKILL for this....atomic inc is greater than lock inc unlock. 如果你不得不同时改变许多领域,那么你可能需要一个锁点,尽管你可以在最有原子眼光的时候改变价值128个领域的轨道。

变幻莫测与原子操作不同。 挥发性有助于汇编者知道何时使用变数的复印件。 在其使用中,如果你有多种线索,希望读“最新版本”而不锁定,那么动荡就非常重要。 挥发性仍然无法解决你的“++”问题,因为两条镜子可以同时读到“a”的价值,然后又加固了同样的“a”,然后是最后一条纸上写“a”胜数,而你失去了一席。 挥发性不会让汇编者在登记中持有价值,而没有价值,从而减缓优化编码的放慢。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签