یک وضعیت رقابتی[۱] (به انگلیسی: Race Condition) یا Race Hazard یک نقص در سیستم الکترونیکی یا رایانهای است که به موجب آن نتیجهٔ خروجی And یا Or بهطور غیرمنتظرهای به زمانبندی و ترتیب رویدادهای دیگر بستگی دارد. این اصطلاح در اصل به حالتی گفته میشود که دو سیگنال با هم رقابت میکنند تا هر یک زودتر به خروجی تأثیر بگذارند.
الکترونیک
به عنوان مثال، یک دروازه And با دو ورودی که در یک ورودی با سیگنال A و در ورودی دیگر با سیگنال Á تغذیه میشود. در این تئوری خروجی هیچ وقت نباید یک شود. هر چند که، اگر تغییر در مقدار A از مقدار انتشار به ورودی دوم بیشتر طول بکشد، هنگامی که مقدار A از صفر به یک تغییر پیدا کند، در یک زمان کوتاه، هر دو ورودی در حالت یک قرار میگیرد و همچنین خروجی دروازه نیز مقدار یک میشود.
رایانه
وضعیت رقابتی در نرمافزار هنگامی ناشی میشود که پردازشهای مختلفی به یک وضع مشترک بستگی داشته باشد. به عنوان مثال بگذارید دو رشته T۱ و T۲ را فرض کنیم. هر کدام مقدار سراسری i را میخواهند یک واحد اضافه کنند. بهطور ایدهآل، مجموعه دستورهای زیر باید انجام شود:
integer i=۰ (حافظه)
T۱ مقدار i را از حافظه خوانده و به Register۱ انتقال میدهد.
T۱ مقدار i را که در Register۱ است، یک واحد اضافه میکند. Register1=۱
T۱ مقدار Register۱ را در حافظه ذخیره میکند. i=۱
T۲ مقدار i را از حافظه خوانده و به Register۲ انتقال میدهد.
T۲ مقدار i را که در Register۲ است، یک واحد اضافه میکند. Register2=۲
T۲ مقدار Register۲ را در حافظه ذخیره میکند. i=۲
i=۲
در حالت بالا همانطور که انتظار میرفت مقدار i مساوی ۲ است، با اینکه، اگر دو رشته بهطور همزمان و بدون قفل کردن داده و همگامسازی اجرا شوند، خروجی دستور باید اشتباه شود که مجموعه دستورهای دیگر زیر این سناریو را نشان میدهد:
integer i=۰ (حافظه)
T۱ مقدار i را از حافظه خوانده و به Register۱ انتقال میدهد.
T۲ مقدار i را از حافظه خوانده و به Register۲ انتقال میدهد.
T۱ مقدار i را که در Register۱ است، یک واحد اضافه میکند. Register1=۱
T۲ مقدار i را که در Register۲ است، یک واحد اضافه میکند. Register2=۱
T۱ مقدار Register۱ را در حافظه ذخیره میکند. i=۱
T۲ مقدار Register۲ را در حافظه ذخیره میکند. i=۱
i=۱
مقدار نهایی i مساوی یک شدهاست به جای اینکه انتظار میرفت مساوی ۲ شود.