Aracılığıyla paylaş


C26117

C26117 Uyarı: unheld <lock> kilidi işlev <func>.

Sözdizimsel olarak kapsamlı kilit zorlama Al ve kilit serbest c/C++ programlarında çiftleri dil tarafından gerçekleştirilemiyor.Bir işlev eşzamanlılık durumu observable bir değişiklik yaparak kilitleme yan etkisi neden olabilir.Örneğin, bir kilit sarıcı işlevine kilit alımları veya kilit sayısı, verilen kilit sayısı artar.Bir yan Al veya kilitleme yayın kullanarak kilit karşı etkisi bir işlev ek açıklama _Acquires_lock_ veya _Releases_lock_, sırasıyla.Bu tür ek açıklamaları onu dönüşünden sonra herhangi bir kilit sayısını değiştirmek için değil bir işlev bekleniyordu.Edinme ve yayımları dengeli değil, olarak kabul artık.İle açıklama olmayan bir işlev olduğunda uyarı C26117 verilen _Releases_lock_ onu serbest bırakır önce işlev kilidi gerekir çünkü basılı değil, bir kilidi kaldırır.

Örnek

Aşağıdaki örnek uyarı C26117 çünkü oluşturur işlevi ReleaseUnheldLock mutlaka basılı olmayan bir kilidi kaldırır — durumunu flag belirsiz — ve bunun çıktıda hiçbir açıklama yok.

typedef struct _DATA 
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

void ReleaseUnheldLock(DATA* p)
{
    if (flag)
        EnterCriticalSection(&p->cs);
    // code ...
    LeaveCriticalSection(&p->cs);
}

Aşağıdaki kod, yayımlanan kilit aynı koşullarda alındığını etmekten sorununu giderir.

typedef struct _DATA 
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

void ReleaseUnheldLock(DATA* p)
{
    if (flag)
    {
        EnterCriticalSection(&p->cs);
        // code ...
        LeaveCriticalSection(&p->cs);
    }
}

Ayrıca bkz.

Başvuru

C26115