Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
#include <ppl.h>
#include <windows.h>
#include <ppltasks.h>
#include <iostream>
#include <vector>
using namespace Concurrency;
using namespace std;
int main(int argc, char* argv[])
{
size_t concurentThreadsSupported = std::thread::hardware_concurrency();
cout << concurentThreadsSupported << endl;
//deadlock hazard increased with concurentThreadsSupported decreasing
size_t taskAmountForWasteVirtualCores = concurentThreadsSupported - 1;//must be equal to (virtual processor thread amount from Concurrency::IResourceManager) - 1
vector<task<void>> t;
for (size_t i = 0; i<taskAmountForWasteVirtualCores; ++i)
t.push_back(create_task([]{
Sleep(INFINITE);//some very long IO operation or deadlocked by EnterCriticalSection or sql transaction or other
}));
Sleep(1000);
HANDLE event = CreateEventA(nullptr, 1, 0, "I am bad guy");
auto locked = create_task([event]{
cout << "unlocker" << endl;
Concurrency::wait(100);
SetEvent(event);
cout << "~unlocker ok" << endl;
});
auto locker = create_task([event]{
cout << "locked" << endl;
WaitForSingleObject(event, INFINITE);
cout << "~locked ok" << endl;
});
Sleep(1000);
cout << "FAIL" << endl;
return 0;
}
Что там майкрософт то курило? Как таких локов избежать, если кучу потоков ждет завершения sql транзакции как в нульпосте (для простоты примера критические секции юзаем)?
Именно из-за второго и вешались все потоки в приложении. На самом деле не все, но в целом казалось что все. Просто те что не вешались в данный момент не выполняли работы.
КЛИЕНТСКИЕ БАЗЫ для всех кто много продает (для юрлиц и физлиц)! Узнайте подробнее! Skype: prodawez390 Email: prodawez393@gmail.com Whatsapp: +79139230330 Viber: +79139230330 Telegram: +79139230330
http://rextester.com/AKZL36928