لا تعطي أسماء مؤشرات الترابط من ThreadPool عند التصحيح في VS

في عام 2017 ، أثناء تصحيح الأخطاء في VS ، انخفض الأداء في المشروع بنسبة 80 ٪ تقريبًا ، مما حول اللعبة إلى مجموعة من الإطارات غير المتزامنة المختلفة. كان الجاني في الاحتفال الوظيفة SetThreadName داخل التجمع.من غير المألوف - ThreadPool هو نوع من المديرين المسؤولين عن التنفيذ المتوازي لنفس الكود. على سبيل المثال ، من الممكن توزيع الدورات. جوهرها هو إنشاء العديد من الخيوط (عامل واحد لكل نواة) ونقل إلى الانتظار / الحذف عند الانتهاء من العمل.

بدا SetThreadName على هذا النحو:

void SetThreadName(DWORD dwThreadID, const char* threadName) {
    THREADNAME_INFO info;
    info.dwType = 0x1000;
    info.szName = threadName;
    info.dwThreadID = dwThreadID;
    info.dwFlags = 0;
#pragma warning(push)
#pragma warning(disable: 6320 6322)
    __try{
        RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info);
    }
    __except (EXCEPTION_EXECUTE_HANDLER){
    }
#pragma warning(pop)
}

في WinSDK الجديد ، يمكن استبدال الاختراق القديم الجيد مع RaiseException بـ SetThreadDescription ، الذي يحفظ الموقف في النهاية. لان RaiseException هي عملية بطيئة إلى حد ما.

كان هناك العديد من المخارج المثلى من الوضع:

  1. لا تعط أسماء العمال من حيث المبدأ.
  2. للعطاء فقط على الإنترنت والحفاظ على التدفقات في وضع الانتظار. هذه الطريقة سيئة عند الانضمام إلى عملية جارية - لن نتعرف على الأسماء بعد ذلك.
  3. لم يتم تدمير العمال. يتم فحص كل مهمة لمعرفة وجود مصحح أخطاء متصل ، إذا تم تعطيله مسبقًا. IsDebuggerPresent

All Articles