Multithreading 这是比赛条件吗?如果不是,我能写这样的程序吗(这个程序错了吗)?

Multithreading 这是比赛条件吗?如果不是,我能写这样的程序吗(这个程序错了吗)?,multithreading,race-condition,Multithreading,Race Condition,我对多线程编程非常陌生。 对定义真的很困惑。 假设我有两条线 x, y, z = 0; Thread 1: lock(x); lock(y); x = y + 1; unlock(x); unlock(y); Thread 2: lock(x); lock(z); z = x + 1; unlock(x); unlock(z); 您可以看到z的值取决于首先执行哪个线程。如果线程1发生在线程2之前,则z=2;如果线程2首先执行,则z=1。根据许多现有的答案,例如,我相信很多人认为不是。但是的

我对多线程编程非常陌生。 对定义真的很困惑。 假设我有两条线

x, y, z = 0;

Thread 1:
lock(x);
lock(y);
x = y + 1;
unlock(x);
unlock(y);

Thread 2:
lock(x);
lock(z);
z = x + 1;
unlock(x);
unlock(z);

您可以看到z的值取决于首先执行哪个线程。如果线程1发生在线程2之前,则z=2;如果线程2首先执行,则z=1。根据许多现有的答案,例如,我相信很多人认为不是。但是的结果是不可预测的-依赖于线程调度对我来说仍然很奇怪。这是语义错误吗?人们写过这样的多线程程序吗?谢谢你的评论

你似乎理解这种行为,我们都同意存在种族。如果这是可接受的/预期的行为,则代码是良好的。如果行为不是你想要的,那么代码是错误的。根据你问谁,你可能会得到不同的答案。如果可能出现不同的结果,我被教导说“数据竞赛”,如果这些可能的结果中有任何一个是不可取的,我被教导说“竞赛条件”。在C++社区中,“RACE条件”通常意味着你已经打破了如何编写多线程程序的规则,并且调用了可怕的“未定义行为”(A.K.A,UB)。当你调用ub时,C++编译器和/或语言支持库被允许打你。P.S.,我认为变量, y>代码>在你的例子中是多余的。你的线程1只能
锁定(x);x=1;解锁(x)
z
的最终值仍然取决于线程的运行顺序。