Windows线程同步(下)
- 线程同步三:事件
CreateEvent:Creates or opens a named or unnamed event object.
HANDLE WINAPI CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
函数说明:
第一个参数表示安全控制,一般直接传入NULL。
第二个参数确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。如果为自动置位,则对该事件调用WaitForSingleObject()后会自动调用ResetEvent()使事件变成未触发状态。
第三个参数表示事件的初始状态,传入TRUR表示已触发。
第四个参数表示事件的名称,传入NULL表示匿名事件。
OpenEvent:Opens an existing named event object.
HANDLE WINAPI OpenEvent(
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ LPCTSTR lpName
);
函数说明:
第一个参数表示访问权限,对事件一般传入EVENT_ALL_ACCESS。详细解释可以查看MSDN文档。
第二个参数表示事件句柄继承性,一般传入TRUE即可。
第三个参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个事件。
SetEvent:Sets the specified event object to the signaled state.
BOOL WINAPI SetEvent(
_In_ HANDLE hEvent
);
函数功能:触发事件
函数说明:每次触发后,必有一个或多个处于等待状态下的线程变成可调度状态。
ResetEvent:Sets the specified event object to the nonsignaled state.
BOOL WINAPI ResetEvent(
_In_ HANDLE hEvent
);
函数功能:将事件设为末触发
CloseHandle:事件销毁
举例:与Mutex中的例子相比,这里只修改了两行代码
#include <iostream>
#include <windows.h> using namespace std; long g_nNum;
#define MAX_THREADS 20
HANDLE g_hThreadEvent;
CRITICAL_SECTION g_csThreadCode; DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
int nThreadNum = *(int *)lpParam;
SetEvent(g_hThreadEvent);//释放互斥量以便供其他线程获取 Sleep();
EnterCriticalSection(&g_csThreadCode);
g_nNum++;
Sleep();
cout << "参数 " << nThreadNum << " : " << "资源:" << g_nNum << endl;
LeaveCriticalSection(&g_csThreadCode);
return ;
} int main()
{
g_hThreadEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
InitializeCriticalSection(&g_csThreadCode);
HANDLE hThreadArray[MAX_THREADS];
DWORD dwThreadIdArray[MAX_THREADS] = { }; g_nNum = ;
int i = ;
while (i < MAX_THREADS)
{
WaitForSingleObject(g_hThreadEvent, INFINITE);//等待获取互斥量
hThreadArray[i] = (HANDLE)CreateThread(NULL, , MyThreadFunction, &i, , &dwThreadIdArray[i]);
i++;
}
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE); //销毁互斥量和关键段
CloseHandle(g_hThreadEvent);
DeleteCriticalSection(&g_csThreadCode);
for (i = ; i < MAX_THREADS; i++)
CloseHandle(hThreadArray[i]); system("pause");
return ;
}
模仿CRITICAL_SECTION例子中的方式,在WaitForSingleObject和SetEvent上分别下断点:
aaarticlea/png;base64,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" alt="" />
然后这次再运行,与CRITICAL_SECTION中例子不同的现象发生了,这次会轮流在WaitForSingleObject和SetEvent处断下,而运行结果也显示:
aaarticlea/png;base64,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" alt="" />
参数不再有重复的了,说明利用Event实现了主线程和各个子线程间的同步。
但是为什么Event可以?
Mutex有一个“所有者”的概念,只有拥有互斥对象的线程才具有访问资源 的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。事件对象也可以通过通知操作的方式来保持线程的同步。可以这么理解,对于Mutex,A线程占有资源S,A可以重复多次访问资源S,除非A自身决定释放,否则其它线程无法去访问S。但是对于Event就不同了。A线程Wait将事件变成未触发状态进行它的操作,操作后,B线程可以触发这个事件,继续B的后续的操作,若无线程释放,则A也无法重复的去获取这个事件以重复进行操作。
此外,Event还有一个API:PulseEvent
BOOL WINAPI PulseEvent(
_In_ HANDLE hEvent
);
函数功能:将事件触发后立即将事件设置为未触发,相当于触发一个事件脉冲。
函数说明:这是一个不常用的事件函数,此函数相当于SetEvent()后立即调用ResetEvent();此时情况可以分为两种:
1.对于手动置位事件,所有正处于等待状态下线程都变成可调度状态。
2.对于自动置位事件,所有正处于等待状态下线程只有一个变成可调度状态。
此后事件是末触发的。该函数不稳定,因为无法预知在调用PulseEvent ()时哪些线程正处于等待状态。
举例:
设为自动置位:
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE g_hThreadEvent;
//快线程
DWORD WINAPI FastThreadFun(LPVOID lpParam)
{
Sleep(); //用这个来保证各线程调用等待函数的次序有一定的随机性
//cout << "启动线程" << lpParam << endl;
printf("%s 启动线程\n", lpParam);
WaitForSingleObject(g_hThreadEvent, INFINITE);//线程在等待时间
//自动就有个ResetEvent
printf("%s 等到事件被触发 顺利结束\n", lpParam);
return ;
}
//慢线程
DWORD WINAPI SlowThreadFun(LPVOID lpParam)
{
Sleep();
printf("%s 启动线程\n", lpParam);
WaitForSingleObject(g_hThreadEvent, INFINITE);
//自动就有个ResetEvent 置为未触发状态
printf("%s 等到事件被触发 顺利结束\n", lpParam);
return ;
}
int main()
{
BOOL bManualReset = FALSE;//自动置位FALSE 即自动ResetEvent(未触发状态)
//第三个参数是FALSE,标明事件被初始化时,其状态是未触发的
g_hThreadEvent = CreateEvent(NULL, bManualReset, FALSE, NULL); //"数组"的数组,其实"数组"就是地址。szFastThreadName[5][30]表示5个"数组",即5个地址.szFastThreadName[i]就是一个地址
//观察内存也可发现,这个数组szFastThreadName[5],保存了5个地址,每个地址处开辟了30字节的空间
//int a[5] = { 1, 2, 3, 4, 5 };//这里每四个字节存一个数
char szFastThreadName[][] = { "Fast1000", "Fast1001", "Fast1002", "Fast1003", "Fast1004" };//这里每30个字节存一个字符数组
//但a[i]是第一个数字,而szFastThreadName[i]不是第i个数组,而是第i个数组的地址。开辟了5*30字节空间,但是用地址代表每个数组
//我们可以想象,a是数组a[5]的首地址;那么,szSlowThreadName[1],就是数组szSlowThreadName[1][30]的首地址
char szSlowThreadName[][] = { "Slow196", "Slow197" };
DWORD dwFastThreadID[];
DWORD dwSlowThreadID[];
int i;
for (i = ; i < ; i++)
CreateThread(NULL, , FastThreadFun, szFastThreadName[i], , &dwFastThreadID[i]);
for (i = ; i < ; i++)
CreateThread(NULL, , SlowThreadFun, szSlowThreadName[i], , &dwSlowThreadID[i]); Sleep(); //保证快线程已经全部启动
cout << "现在主线程触发一个事件脉冲 - PulseEvent()" << endl;
PulseEvent(g_hThreadEvent);
//自动的话,已经有了一个ResetEvent
// SetEvent(g_hThreadEvent); //触发
// ResetEvent(g_hThreadEvent); //Sleep(3000);
cout << "时间到,主线程结束运行" << endl;
CloseHandle(g_hThreadEvent);
system("pause");
return ;
}
aaarticlea/png;base64,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" alt="" />
自动置位的思路是这样的,由于CreateEvent的第三个参数是FALSE,所以,这个事件一上来是未激活的。主线程先起来7个子线程,当主线程执行一个PulseEvent时,会在某一瞬间触发一个事件,所以会有一个正在Wait的子线程被激活而顺利执行,但由于是自动置位的,所以这个被激活的子线程在WaitForSingleObject后,就立刻自动ResetEvent了,于是其它的线程无法被激活,由于主线程没有WaitForSingleObject,所以,只有主线程继续顺利执行下去。
而如果设为手动置位结果如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU4AAAEVCAIAAAAAeJsKAAAgAElEQVR4nO19+ZeUx3X2+49YGsHMMPuwzwIIxDJYyJIla4vt2EnOSb6TL79GmyVkjFiFACG0EO2IYZl92BeBoAUasQiEQELW5tixI1uxkvwN+aGhKere+9St6re7mbfrOXP6VN+6de9Tt+5TbzPMQPLY06vyX4eP5U59eJZ+nRzz+KLLP/jw7Kkx8+vMqbEznOXMyetfp98fO/3+B4WvD82v3KnrXydOjZ04OXY8//V+/uuD997/4L3cB+/lPjiWO3Usd+rYiVNHT5w6evzk0eMn3z3+/rvH3z/y3vtHjr1/+Fju8LHc4aMnDh89cejoiYPvHj/47vGDR44fOPLegcPv7T98bP/hY/sOHd176Ojeg0f3HHx3z4F39xw4svvAkd37D4/uOzy67/DIvkMjew+N7D04vOfg8J6DQ3sODO0+MLj7wODo/sHR/QOj+wdG9g2M7Osf2ds/srd/eG/f8N6+4T19Q3v6hvbsyn8N7tk1uHvX4O6d5tfA6A77a2THwMiOfuZru/XVV9RXb98w+Np+/au0iWDqq1+y5425hOL0+nNI6wtvAZbXsXf8lTz29OrHnl59+FjuV08tu7W2saRfNYWvuqZrX801dc3X39Y2FXzQct1XCLHQCGX7qghJuchNxlGaB2p93ejjyVx/Ogal5pq65pr6/FdLTX1LTf2NZGqb0iqd13H49nBaHX5rbWPy+K9XP/7r1ac+PFdT25RkEblcLvVVdDZvAavCaEREpIYnlq19YtnaU6c/qqlrrjSXUiFAZmFSlxbmrsEcm/ClFxHhjV8989wTy9d9cOb8bfUtleaSGlg5sdICdhBcb9REjlKPKAeeXPn8kyufHzv78YSG9kpzSQ2+z2QvH/YBbj2xQbQo9YjK4Om1Ly1d+9LYR59MbJ6aCA8iYA8D2+7OR64+ezFSx0mBvDW3A5s9Sj2iHFi24fVlG17/8PzluraZZr9KT6fi+1K6R/DYK3sxUqc+Fh9W2GxM9srAV0lERKnwzOZty1/Ydubilfop3aWWOtBJ6lLHAG6FKTMajc9awAY1tCMiSoiVW/pXvtJ39tIXDdPmOrUkqRRr0qlYIG+cHfDUuAFnIHW6F1belo+eT0RESbD69ZHVr42cu/x148z5ifyNpTyAaIFcnVJPFJrxEkzppA4qI/lYm8oJ0BOOiAjB2jf3rn1zz7lPv2nqWFAwKvXmlHrh1Sl1r7xOFOlMtWrSYPVp+tC15msYyYiIYrH2rX1r3tx77tNvmjoWStItoCJS99W5lZeF5ZncKDygScBEIp9EqUfcDFjz5t41b+zOP9XTknpyo9ppi7Nd7muXwKqXdZDGYZqkoaR7BFw9ERGlwurXRla9Nnz28lfWn9VZfdJZ7J9w1wG7BDR96aTO8qGrWAvlD1JL+5I3ERGRNlZu6V/xSt/ZT75omDa30lxSAJWf3scpdek+cgaJUo+oPJa/sO03m7ae/vhK/ZTuSnMpFuwnCxaaCBrRSsqXVgVQiohIB0+vf+3p517N/7RcpbmkDM1THduDFah5qkdElBVPrXnxyTUvjp27mP8Z+OpBmPzwKumyUH6OiIgoIZ5YseGJ5Rs+OHMhS7/ZpkSAzMKkLi00P73HT/URpcVjy559bNnaU6c/ytLvq0sAf1S2pAXsILjeqIkcpR6RJh5ZuuqRpatOjp3N8L9CU4DvM9nLh32AW09sEC1KPaK0eOSpFf/65IqTY2drapvK9hmSbWvfp2sAyWKkjosD5K25HdjsUeoRaeKRp1Y88tSKk2Nnb61tTOAPwPlCWkvDsjIOsAdT0sxSH6tQrLDZmOyVwd0kbj4REVo8unTFo0tXnBw7Q6WeFPe3TexjStIDlU2AXckKALgVpsxoND5rARvX0I6ISAGPLl3xyFPPsFLPkScn26zULunEnGUt1hJfuxNe0mKdgdRBBaT4UeoR5QP7AR70qGmXxvStFMGysErW250ondTBZiUfq8g5AXrCEREI16Tu8VTXSDpA6qySvexOeCmHOlPalD+tD1hrvoaRjIjQ4tGlKx5Zyn+AL8DSP3YAbtiZpvC1O0FvCi+JAk0CAlLFkij1iHLi0aUrH13Kfwe+AElXQG+WLKVoXmuddgxWvayDNA7TJA0l3SMUmvgRESo8/utVjz698uSHZ2tqG0GTmXaqcOcS6oyngu0ArMAkBxqf3aBmyyA1y0S5nYgIPzy+bNXjv1516sOzNbWNleZSQlD56X2cUpduHGeQKPWI8uFXy9c+sWztqQ/P1dRl839iTeRvfbNPb2cEjWgl5UurAihFRPhh6crnnnxm3diZjyZUwa+75KF5qmN7sAI1T/WIiJJg2ZpNy1ZvHDt7fmJDW6W5lBVhMsOrpEtB+XkhIqKEWLH+5eXrNp/+6OO6psmV5lJuBMgsTOrSQvNTevz0HlFarN706qqNW86evzSpdXqluZQc4I/ElrSAHQTXGzWRo9Qj0sS6F996dvMb5z6+3DS5o9JcSg7fZ7KXD/sAt57YIFqUekRpsWHLO+tf3nr+4pXmqV1l+wzJtrXv0zWAYTFSx8UB8tbcDmz2KPWINLHx33rXb9l2/tKV1mndCfwBOF9Ia2lYVsZKuxfJYqROfSwOrLDZmOyVwd0kbj4REVps2LJtQ17q02clnLrCwrKdCvRAZQPszkSYFQBwK0yZ0Wh81gI2rmQeEVEs1r+ydf0rb5+/dKWFe6oX3LBKLbukE3OWtVhLJDuOBuAlLdYZSB1UQIofpR5RPqx78Y11L755/uJnzVM6E0WPmnZpTN9KESwLq3BqN1cVr14vZ0nqYLOSj8U/J0BPOCICYc2mV9dsevXcx5cb2mYkuqe6RtIBUmcVztqVidjUSk/WmdI2OUj1AWvN1zCSERFarNrw8qoNr5y9cKm+ZWqikJNSb2FStxwkuzIRmzrhlKmUKNAk4CDRTqLUI8qJZ9ZtXrFu85nzF2ubJieeUgc6tOQqRfNay9r1UmfVyzpI4zBN0lDSPUKhiR8RocLytZuWr9105qOPJ0xqBU1m2qnSnEuoM57ysit3ygpMcqB52Q1SC+UJUrNM9DuKiPDAb9Zs/M3qjafPXbitPsv/uwuVn97HKXXp0nEGiVKPKB+Wrd6wbNWG02cvxN9XBxrzFa2kfGlVAKWICD/8Zs3GZas3nD53Idv/Co0JzVMd24MVqHmqR0SUBMvXbFy+ZmNVST2PMJnhVdKloPy8EBFRQjyz9vnla58/fe7jW6tM6kmQzMKkLi00P6XHT+8RpcWKZzc98+ymMx9VhdTBH4ktaQE7CK43aiJHqUekiZXrNq9c98LZqpF68KzTh32AW09sEC1KPaK0WPXc5pXPvXD2/MVbb/x34Ev6GZJta6+nqxTHN6/XLCgOkLfmdmCzR6lHpInV6zevfm5zXupJ6A+isZDW0rCsvIE9mF4xUqc+VqFYYbMx2SsDXyUREcVizYaXVm948Rwn9aS4v1ViH1OSHqhsnPYwqWMAt8KUGY3GZy1g4178IyLCsWbjy2s2vnzuwifj6P9Xl+I44eXPOgOpgwpI8aPUI8qHZze98uymVz76+NI4+v/VnSkklE7qYLOSj1XknAA94YgIhOde2LJu05bzN0o9P0V1RftPcyM4p6zI1oDanSkkFCl1SttkItUHrDVfw0hGRGixfvOr6ze/ev4iI/UCLP1jB+CGnWkKye5MIYHeIF4SBZoETKSKJVHqEeXExhdf27D51fMXL4+j/19dioPBqpd1kMZhmqShpHuEQhM/IkKF519+/fmXXv/4k8u3jp//Xz1MEqzAJAcan92gZssgNctEuZ2ICD+8sOXNF1558+KlT7P96y5Ufnofp9SlG8cZJEo9onx46dW3N//bWxcvfZZhqVOBSdBE0IhWUr60KoBSRIQfXn79nZde23rx8pUMS92C5qmO7cEK1DzVIyJKgi1v9r78+jufXL5SU5vZf4WGRZjM8CrpUlB+XoiIKCFefXvHljd7L336eYb/wSkJATILk7q00PyUHj+9R5QWr7+z67W3d1z+rCqkDv5IbEkL2EFwvVETOUo9Ik28sa3/9Xd2Xv7st1Ui9eBZpw/7ALee2CBalHpEafHW9oE3tvV9euWLmrqmsn2GZNva6+lqOQTn9ZoFxQHy1twObPYo9Yg08faOwbd6+/NST+APwPlCWkvDsvIGdstSHqlTH6tQLBlwPVlL8FUSEVEstu4cenvHwGeff5n/DjxVV1hYtlOBHqhsgB1Hc7ICAG6FKTMajc9awMaVzCMiikVv3/A7Owev/PbLmnH1++rURwMvabHOQOqgAlL8KPWI8mHHwMj2vuHPv/iqZvz8vjrIi1E6qYPNSj5WkXMC9IQjIhB2Du7eObD7t19+rX+qayQdIHVW4U67lyS8lEOdKW3Kn9YHrDVfw0hGRGjRN7x319CeL776Ztz9vrozEZs6EW4KjUSBJgEHiXYSpR5RTgyM7Osf3vfF1yFSBzq05CpF81pbpNRZ9bIO0jhMkzSUdI9QaOJHRKgwOLp/cGTfl1//bhz9vjo769wpKzDJgeZls0t8LB8pNctEs5eICG+M7D04sufg19/8e7Z/s43KT+/jlDq4iXCQKPWI8mH3/sOj+w5//bvfZ1jqVGASNBE0opWUL60KoBQR4Ye9B9/dc+Ddb/79DxmWugXNUx3bgxWoeapHRJQE+w8f23/o2O9+/x/x99WLXyVdCsrPCxERJcShoycOHT3x+z/8sRp+s81CgMzCpC4tND+lx0/vEaXFkWO5w8dyv/+PqpA6+COxJS1gB8H1Rk3kKPWINHH0+Kl3j5/8wx//VCVSD551+rAPcOuJDaJFqUeUFu+9P/Ze7oM//uk/x9fvq4cxLEbquDhA3prbgc0epR6RJk6c/PDEybE//unbcfT76sEki5E69bE4sMJmY7JXBneTuPlERGhxcuzsybEzf/r2z1TqSXF/q8Q+piQ9UNl42b1YAQC3wpQZjcZnLWDjSuYREcXig9PnTn147j+//UtNXXNCVFRwwyq17JJOzFnWYi2R7DgagJe0WGcgdVABKX6UekT5MHbm/NiZj77983e31bckih417dKYvpUiWBZW4dSuySKlLtJZkjrYrORjFTknQE84IgLhzEcXT5/7+Nu/fDexoS3RPdU1kg6QOqtw1u5MIaFIqVPaJhOpPmCt+RpGMiJCi3MXLp278MlfvvtrbdPkBP4Zm45ZB+CGnWkKyY7jA9AbxEuiQJOAjFSxJEo9opy48MlnFz759Lv/+r6+ZVriKXWgPUuuUjSvtaxdr3lWvayDNA7TJA0l3SMUmvgRESpcvPz5xcuf/9df/7uhbQZoMtNOleZcQp3xFLaHSYIVmORA47Mb1GwZpGaZKLcTEeGHS1e+vHTli79+/z/NUzorzaWEoPLT+zilLt04ziBR6hHlw6eff3X586++/+//bZnWXWkupQIVmARNBI1oJeVLqwIoRUT44bMvvv70t19//z//2zp9VqW5lAmapzq2BytQ81SPiCgJPvvim8++yLLUw+SEV0niV34uiIioAM5euHzmwuU/f/d9y9Rq+QBf/BL853bWv/BpPH5Kj6gMVqzfsmL9lrMXLjdN6ag0l9QA/uhrSQvYQXC9URM5Sj2iHLjnZ/98z8///95D7zW0Ta80l9Tg+0z28mEf4NYTG0SLUo+oDBbe+8uF9/5ieN+R+uYpifz35Ol+2mTbHejEN28xUnd+CrDGmspEqUdUHvPuenjukocHRg9MbGwz+xWorsiM0j3CzoZlLEbq1MfixgqbjcleGfgqiYgoFWYtuq+75yf9w/smTGoptdSBTti8welYOdHseMqMRuOzFrDBgF1ERKSJjvn3zJx/d9/Qntvqm53SklRq2b3eJqWRepHOQOp0L6y8LR89n4iIkmDm3B/NmLtk5+Co+a/QKLtWKVGn1BNBMxohSTyLdJakDioj+eBNBewuIiIE0+csmTbnzp39o+b/7iI1n6/UC69OqXvFd6JIqVOtmhxYfZo+dK35GkYyIqJYTJ3zwymzFu/oHyn8T6x5Oyut8SV1qkylRIEmAQepYkmUesTNgCmzF6cu9eRGtdMWZ7sce+qlzqqXdZDGYZqkoaR7BFw9ERGlwpRZiyd392zvH7m1tjFxfZOczmL/hJMru0Rq+gA96KXO8mE5SKwsHyk1y0S/o4iIFDB5Vk9796KC1Mc7qPz0Pk6pg/sIB4lSj6g8Jnf3tHcv2t43nAGps58sWGgiaEQrKV9aFUApIiIdTO5e1NaVEalb0DzVsT1YgZqnekREWdHe3dPeubA3Jan79rTSXxKh8vkcxiGYW7ooc0nTzRLsH5E+2rsWtXUt7O0brhGkHvwBWAnNEtCX7HKTp5N/gNTNKWmcFiordXDokn8xrCJKiPbuRa2dV6XOSkJ//ZfoOPUtxfYl5u/bymwE5aoASEdQmNWDjcwOsBs7G2aMKCvauxe1dS2ynupKqQS0WkBfst2Wu/GJLTHE/Nngej5s8BQRlkjjiSvAerL10RMoaaEiVGjv7rn2Ab6pYHSKgcYJPku8EMgbLFRKHVwi0mwi3AXgaggDoE3tvmSs/YIlUhFoEC9i7EaCERA/FTJl2JqSg/T2BrR391x9qtelKXX9noEnKKKyt1gjLY3lb6XADJ0bDIAUNqDydIlZAfagqTPbQLRigJgzUZGwNqVMofdURijR1pTZgTFJkqR9VgpS11gA3QCfQpOxjeibnb6yAyerVBAmXQDWn0Zjt2N5mjGl+AmppCZRkbA2pUyh9yxdhOD43lPt3T1Xvy134y+xmidaWG8NQFz9/p2eVpeAJgZ8cHD6yg7YRBROB2mVspJ4g3jv7E7BQrYIgC3NIi1PFyYZtp5SbWkR6Dk67YUxIAPi5G6EZKdTQjEEB0vqFumEO2w6a1aWBSWhd5Z2IvlYcXAWanRSohvXEA6GM6C+njnuBHEidknuxkPXLylmR15LTCMdW6vYt8o4XnmD40v7ZQoBHFq7FmmkTl/ZARsBA3jmCOgqaznLEyQK252TQIrwDei1a4CCp1R8WmS6lqWReokKqYHR6eB0k0rBNgwYS0VmCbB8gB05tHYuaulAUjctUnTJXwMnYzCFedJTlOLr/emUNE4Lzgoo4YyJjdIAHL2STCqQmsEio1lF7YCzV15NuiJTo6nWzoUtHQt6dw1Jf9mWcMdMQzstEoIP3qpIIvDErSbZaUzAGXgWD9+w0tkVadQMgF0apwW2uYGEWKPkD+LQt6Y9xfga/sCYJEnS0rGgpWPBtl1D9B+cch4q3SGwSNB4slUDxNiYwGhFs/yDg6cCZ+ScC8qY2EhLdJPUJxF0ZU0VxnSJZHemwNXGfCRPkBrsHSe9ipaOBU0z7shLXdokHQMfySIBeEqbpJScfLAxZ7SCBGWQ1OEbVuPvW59EaEHn2ItVRGnRNOOOphl3bNt59amONQOk7oTSDUuLNhxrtBpUGT8nK5Y10tQsvSKhDwj4a2Jio7JQXsEjyoqmGXc0Tb8udRPSmQFpVQphfIJVyhYhLJQmV+rOSjVaN2YwqwD/iPQBpM4CNERaKL9OpE2B5cUrsBhZFo+ovaqD9QHeCefHPBZ4tqSfETTR8AON9S/Qdm4HBHES07iZDhoy1ir9kojxjatS33X9z+r4yAO61ndJmVvNa5u0Mk5hO8XGxndCk0JCFHM1onnm/OaZ83t3DRV+Br4wpdGApmmcYrCMxTRiMTqhe2f9WU9p1oqvpASiBfuEOUdkB80zFzTPXNC7a1iSOm5Ny5/tXan1pXG6vYij4f3qV2lmQR2UDItHiYocMQ7Q0rHw2g/GNifFPdV9x5al/FKX7iZpFXvfUaO5EXBxSMTYgCCOZiHrLMWJyCZaOxe1di7q7Ru5rb7kUse9mCu71IFPjsjYN6bk75Si/i0QM2aoPJGITKG1s6e1s8eUOj5v3HnOMXColNSBDiV/L4bF3AvOt3ofc1YTJCJraO3qaXE91YFuNTpRNlZaUheeUryAgZ4lHysOzhKwlyKljiufu/FWdUaOyA6Mp3pL4v89M02TlVnqzkTmlHQL4P2ygmF3ROODe0FaBZwx20R3iMAYkR20dvW0dvX09pdJ6qB3cSMGA0cDs6yucj5SZ41OC1suTRb97RClXo1o6/5hW/cPt/ePTpjUmpT423IgTiJLnW1WPYLX0i2wDDXSwnwkf3CtSBGCrxtniohxj8mzl0yevWTHwO6JDW2J4vtSWOrsWt/GKr/UJc7g9vFKZMb3FR6WsXNK7x+lnnFMm3v31Ll37xzcM7GxPSnuqS5BiiPdKUoxKKFUoLSE1adSKmG7AxclYOtVoij1asTMBffNnH/frqF9dU1TsKe+6aUlQN7BKSxPPdjgkpYkSr7xpSU4O+CTIxcB5iPtmk0UkSl0LX6oq+eh/pED9S1Tnc6aRsQOvv43CXx3oQ/ljFaKggScY8S4x5y7fjZ7yc8Gdh9saJ1eaS6lBdvN6Yo2ILJedSCg19aCifkiLILyc01wuuq91Obe88u5d/9icM/hhrYZleZSWrCfaZVGzcdgmk7JSr/QS71FXhnSGIOu0lSy4K+sc5R6CO649+/n/fjvhvYeaWyfWWkuJUThgNkODlCXtVwPJ7GAXmTDOjPiOE69gQjmK47g1L+eCS6C77lkENUgdbZXlI0IjLg/NN3DSsvZsqyRztIB7m+WjC9ygtR9q5HIBXFWgG4NZKkimB/gvUpWDGhYKanGnhYH4MCOaQv6Nh/YqXMJoKTxCeCvKbVJoPCqjEP5gF0Afw3DasScu342e8lPB0YPTmqdllw7mPyU8nQlgBNlm4y+1dj1JL36mMaknYeXaAI6u1niwI5prcytOfljtkqYuSgrHFyqmHXW7HnhsPpzzzK6Fj/U1fNg38j++uYpCaeusLDSYbD1tZre7E6lPYwhJi+1RU6Qim9LWbtQEks4CbHBJX+Jv4aAE155w+qckL3jUnu9zTJmLrhvxtUfoZmcwP6T6kjtztJLFnrYrB1HU0K5ytpXopCKftYKiBdaFaBFlqhKtJ2JwCHq96XMS1NI/r7HjZeHNc+4xPUfjFX/DLzVbXRM30oRLEvhlQ7wQgypd1nQtZKFJaOJLEVwGqVXupCm1myWDQtY6XmyA7rKWSUlDRpc+TbLmDx7yeTZd+4wfrNNKrHUtVLHSEWkU2xTArszRYoATY+za1qKbpNCymhNgVkpCKCk5A925JVX6S8Vh7WbwZ0Vrgq0dS9u61q8vX90wrXfV2dPwio3cABu2JmmkOw4vi/YOKAn2IEemtQaqhYNNjKY0sfHS9gIbHY6kOzSQpaJ02Itt05Bv7Vxj5bORdY/OMXWzmprPDbfsv2NLdJa1s4SpsjpwC6ULDgvaLgAI52yaLAlZffF+gPOmvKyS+gryKK3Y87AX+JTLTD+Hfhm0PSm3XRQLqHOeArbQRwn9J3hnKWtiaEMrswojU1LjmvrnEtaSjKAIc3LMmF9NBzMkioPlO7ad2vjHk0z5l/9j5zqmirNpUzQtLg5K8k1+I7APhqpO1VkSc55AQEmXpJgpS7pWVlPM47mFKgDIFBFgr8udd1/z5gBWC3I9ookb7xQM8sycRqtKS8VAT5gCwGSYEXolCKw0wjOwzKpsrSlCCylTKGlI/8Bvoqe6ib0befloGydMKmzOmcdEs8+Brebbyjsr994wEGkcjQZRHv34raunt6+4Zr65kpzKS3COsk3oG/kYh56eCr4FvNySz2C8jkcnK56pT5t3t1Tb79rx8DohEktleZSWrAf85RG9nFXZqmDqbSkbk5JYwy6SlPJgr+yzlHqIeha/GDHwp/sGtqb/2m5rKJwwGwHB6jLWq6Hk1hAL7JhnRlxHKfeQATzFUdw6l/PBBfB91wyiHk//uWcu37WP3og/+sumQTbK8pGBEbcH5ruYaXlbFnWSGfpAPc3S8YXOUHqvtVI5II4K0C3BrJUEXoe/Kf59/3D4J7Dk1qneZWsGNCwUlJMphh6zrVSp4IW9G0+sFPnEkBJ4xPAX1Ntk0DhVRmH8gG7AP4ahtWIO3/6L4se/KehfUca2qYn1w4mP6U8XQngRNkmo28lexg9rz6mkWnn4SWagM5uljiwY1occ2tO/pitEmYuygoHlypmDqTzwmH1555l3PnTf+l58P8N7Xs3/89IWpsv5sil5qZTVtOb3QnsRZ4TbnTQFjlBKr4tZe1OSSzhJMQGl/wl/hoCTnjlDatzQvaOS+31NstY/PA/L3zgH4f2HaFSlwpqLmftztJLFnrYrF2K4wXlWitjopCKftYKiBdaFaBFlqhKtJ2JwCHq96XMS1NI/r6HjpcX00LjDIse+Mf59/3D4N7D5gd4cLq02+iYvpUiWJbCKx14pWAzKkHXShZ2F5rIUgSnUXqlC2lqzWbZsICVnic7oKucVVLSoMGVb7OM+ff9/dx7fjGw+xD7b8sV3EDXSh0jFZFOsU0J7M4UKQI0Pc6uaSm6TQopozUFZqUggJKSP9iRV16lv1Qc1m4Gd1a4KjDvnl/Ouevn/aMH8/+RE7t50+h0AG7YmaaQ7M4UXmCDgJ5gB3poUmuoWjTYyGBKHx8vYSOw2elAsksLWSZOi7XcOgX91sY95t7zi9lLflr4e3XajpZRMzbfsv2NLdJa/BYjpwO7ULLg7KDhAox0KicIo2CU9sX6A876IltL6CvIordjzsBf4lMtmHv3385e8jf9I/vrmqeApjftpoNyCXXGU9gO4jih7wznLG1NDGVwZUZpbFpyXFvnXNJSkgEMaV6WCeuj4WCWVHmgdNe+Wxv3uP3uv51158N9I/vz/2JsNUDT4uasJNfgOwL7aKTuVJElOecFBJh4SYKVuqRnZT3NOJpToA6AQBUJ/vYf/bz7hw/1De+rbWyvNJcywWpBtlckeeOFmlmWidNoTXmpCPABWwiQBCtCpxSBnUZwHpZJlebcn9EAABO1SURBVKUtRWApZQqz7/ybzkX3Z/7XXSTo287LQdk6YVJndc46JJ59DG4331DYX7/xgINI5WgyiM5F98+Y/+Odg7vz/zh0hhHWSb4BfSMX89DDU8G3mJdb6hGUz+HgdNUr9enz7pkyZ8n2/qv/YmyGwX7MUxrZx12ZpQ6m0pK6OSWNMegqTSUL/so6R6mHoH3W4tauRb27hmrqsvxvyxUOmO3gAHVZy/VwEgvoRTasMyOO49QbiGC+4ghO/euZ4CL4nksG0TxzftOMee/sHLx1YkOluZQKbK8oGxEYcX9ouoeVlrNlWSOdpQPc3ywZX+QEqftWI5EL4qwA3RrIUkVomHb7pClztu7ov2XiJK+SFQMaVkrqay+GA3Bgx7QFfZsP7Mi5BFDS+ATw19TZJFB4VcahfMAugL+GYTWifvKsuvburdv7b5kwKbl2MPkp5elKACfKNhl962t38tH3MQ1IOw8v0QR0drPEgR3Tmphbc/LHbJUwc1FWOLhUMXMgnRcOqz/3LKOurauurYuVelLckUvNTaespje708vuyxCTl9oiJ0jFt6WsXSiJJZyE2OCSv8RfQ8AJr7xhdU7I3nGpvd5mGbVtnbVtndJTveAG6kjtztJLFnrYXnYvKJdY+0oUUtHPWgHxQmuntMgSVYm2M5EU3Gtfyrw0heTve9Z4eUDnjFfUtnXWtnVt3d5/68TrUgenS7uNjulbKYJlKbzSgcYuQepdFnStZGF3oYksRXAapVe6kKbWbJYNC1jpebIDuspZJSUNGlz5NsuovfYBPv8deLPcuHVMOw0r2dkptikD7KUAaHqcVNNSdDsUUkZrCsxKQQAlJX+wI6+8Sn+pOKzdDO6scFWgrq0r/205KvUCTKPTAbhhZ5rC1x4Gdi3oCXaghya1hqpFg40MpvTx8RI2ApudDiS7tJBl4rRYy61T0G9t3KOuvTtY6tLYfMv2N7ZIa512gJwO7ELJgpOChgsw0imLBltSdl+sP+DsrK20hL6CLHo75gz8JT7Vgrr27vprUgdNb9pNB+US6oyngu1O6DvDOUtbE0MZXJlRGpuWHNfWOZe0lGQAQ5qXZcL6aDiYJVUeKN2179bGPeoNqVeaS5mgaXFzVpJr8B2BfTRSd6rIkpzzAgJMvCTBSl3Ss7KeZhzNKVAHQKCKBF/NUgePBUneeKFmlmXiNFpTXioCfMAWAiTBitApRWCnEZyHZVJlaUsRWEqZQl31Sd2Evu28HJStEyZ1VuesQ+LZx+B28w2F/fUbDziIVI4mg7C+LZcBhHWMb0DfyMU83PBU8G3l5ZZ6BOXzNjhd9UpagvWXbRkA+3FOaWQfa2WWOphKS+rmlDTGoKs0lSz4K+scpZ4mrv8IzYRJleaSAgoHzHZwgLqs5Xo4iQX0IhvWmRHHceoNRDBfcQSn/vVMcBF8z6WKUPjB2FvGv9TZXlE2IjDi/tB0DystZ8uyRjpLB7i/WTK+yAlS961GIhfEWQG6NZAlIqlt7axt7dy6vc/8dRe2P5zF1YMGAfGLzOtcKHUqaEHf5rPCei0BlDQ+Afw1pTYJFF6VcSgfsAvgr2EYcR0TWztqWzu39vbdMqHePB72qJR9gEGDgLwBGb36mN2jNAh4m5DdAU92io5pfcytOfljtkqYuSgrHFyqmNUD7HnhsPpzr0aUU+pS3aW8qZwQbnTQFrQFnaucRcsR3QLOOSIhNrjkL/HXEHDCK29YnROyd1xqr7fViKtS325LnQVbX1p3r7eWRRoHQxnBYpgopKKftQLihVY9cYvT+JS2M5EU3Gtfyrzs6bP+vkePlxffSOMeta03fFsOnzftM6sjnW70rWm0svu2oNS7LOhayUKbRhlZiuA0Sq90IU2t2SwbFrDS82QHdJWzSkoaNLjybTWiNv/36jtu+Ht10B+0z8BYOlqp7sr4pQBoepxX01JAhAVIGa0pMCsFAZSU/MGOvPIq/aXisHYzuLPCVY269u76ybPe2TlQU9toVoStjmWU/M3jwavC4oeBXQ56gh3ooUmtoWrRYCODKX18vISNwGanA8kuLWSZOC3WcusU9FvLLOonz2qYOmfbzsGauiar0dni0oLiKbbvpdYHntIqNogT7ELJgvOChgsw0qmcIIyCUdoX6w84a8rLLqGvIIvejjkDf4lPtWPSlNmN0+f27hqaUN+c3Ng6ppukFuxvDkAQc8qiJ8V3Qt8ZzllnKaRN4eDKjNLYtOS4ts65pKUkAxjSvCwT1kfDwSyp8kDprn23llk0TJ3TNOOO3v7hiQ1Z++8ZNS1uzkpyDb4jsI9G6k4VWZJzXkCAiZckWKlLelbW04yjOQXqAAhEwScN025v7pi/vX8ke//pstWCbK9I8sYLNbMsE6fRmvJSEeADthAgCVaETikCO43gPCyTKktbisBSqgo0Tp/b0rFge/9obWN7pbmUEPq283JQtk6Y1Fmdsw6JZx+D2803FPbXbzzgIFI5mipC4/S5LZ0LdgxkXOpJSn9G1a8NvgUCbiWvrRVzPXkhLILy+RycrnqvgCp5qifcJ0C9kX0MllnqYCotqZtT0hiDrtJUsuCvrHOUeggapt3ekv+zemPW/qxuonDAbAcHqMtaroeTWEAvsmGdGXEcp95ABPMVR3DqX88EF8H3XDKIa9+BH8ned+ALYHtF2YjAiPtD0z2stJwtyxrpLB3g/mbJ+CInSN23GolcEGcF6NZAlirC1b9X7xuaMKnFq2TFgIaVkmrsaXEADuyYtqBv84GdOpcAShqfAP6aUpsECq/KOJQP2AXw1zCsRlz7abmhmvqm5NrB5KeUpysBnCjbZPStxq4n6dXHNCbtPLxEE9DZzRIHdkxrZW7NyR+zVcLMRVnh4FLFrLNmzwuH1Z97llHX3l0/5erPwCecusLCSofB1tdqerM7WbszkZIhJi+1RU6Qim9LWbtTEks4CbHBJX+Jv4aAE155w+qckL3jUnu9zTKs32wD/SfVkdqdpZcs9LBZO46mhHKVta9EIRX9rBUQL7QqQIssUZVoOxOBQ9TvS5mXppD8fY8bLw9rnnGJ2tbO2rZO+vvq0unSbqNj+laKYFkKr3QgpdAcldS7LOhaycLuQhNZiuA0Sq90IU2t2SwbFrDS82QHdJWzSkoaNLjybZYxsbVjYmvn1u19P5hQn+ie6tROw0p2doptSmBXJkoFoOlxXk1L0W1SSBmtKTArBQGUlPzBjrzyKv2l4rB2M7izwlWBia0dE1s73u7t+8FtttQLMI1OB+CGnWkKya5MpAS7HPQEO9BDk1pD1aLBRgZT+vh4CRuBzU4Hkl1ayDJxWqzl1inotzbuMbGlY2JLoNSlsfmW7W9skdaydpYwRU4HdqFkwXlBwwUY6ZRFgy0puy/WH3DWlJddQl9BFr0dcwb+Ep9qgSl10PSm3XRQLqHOeMrL7rVffWc4Z2lrYiiDKzNKY9OS49o655KWkgxgSPOyTFgfDQezpMoDpbv23dq4h/VUrwZoWtycleQafEdgH43UnSqyJOe8gAATL0mwUpf0rKynGUdzCtQBEKgiwVez1MFjQZI3XqiZZZk4jdaUl4oAH7CFAEmwInRKEdhpBOdhmVRZ2lIEllKmUIVSN6FvOy8HZeuESZ3VOeuQePYxuN18Q2F//cYDDiKVo8kgqkfqYZ3kG9A3cjEPPTwVfIt5uaUeQfkcDk4XpV4VUqcf85RG9nFXZqmDqbSkbk5JYwy6SlPJgr+yzlHqIagSqRcOmO3gAHVZy/VwEgvoRTasMyOO49QbiGC+4ghO/euZ4CL4nksGUQ1SZ3tF2YjAiPtD0z2stJwtyxrpLB3g/mbJ+CInSN23GolcEGcF6NZAliqC9PfqzpIVAxpWSuokE0zSuUrqVNCCvs0HdupcAihpfAL4a+psEii8KuNQPmAXwF/DsBoBflpOeboSwImyTUbfSnbLoj9jfR/TmLTz8BJNQGc3SxzYMa2VuTUnf8xWCTMXZYWDSxUzB9J54bD6c88y8A/GFnPkUnPTKavpze5k7TianiEmL7VFTpCKb0tZu1MSSzgJscElf4m/hoATXnnD6pyQveNSe73NMvBTveAG6kjtztJLFnrYrJ1OBWxcucraVwJbUB8/x4kBL2QrINWZxqe0nYmk4F77UualKSR/3+PGy8OaZ1yClTo4XdptdEzfShEsS+GVDlg7TmTFV4KulSzsLjSRpQhOo/RKF9LUms2yYQErPU92QFc5q6SkQYMr32YZAU91aqdhJTs7xTal0g66NhWApsdJNS0FtmNtnAaxpsCsFARQUvIHO/LKq/SXioObAZdXua8soJhfYmUdgBt2pikkuzKREuxy0BPsQA9Nag1ViwYbGUzp4+MlbAQ2Ox1Idmkhy8RpsZZbp6Df2rjHePx9dRyNRU4HdqFkwXlBwwUY6ZRFgy0puy/WH3DWlJddQl9BFr0dcwb+Ep9qwTj9fXVndgn6znDO0tbEUAZXZpTGpiXHtXXOJS0lGcCQ5mWZsD4aDmZJlQdKd+27tXGPavhpOQuaFjdnJbkG3xHYRyN1p4osyTkvIMDESxKs1CU9K+tpxtGcAnUABKpI8NUsdfBYkOSNF2pmWSZOozXlpSLAB2whQBKsCJ1SBHYawXlYJlWWthSBpZQpVKHUTejbzstB2TphUmd1zjoknn0MbjffUNhfv/GAg0jlaDKI7Ek9rGN8A/pGLubhhqeCbysvt9QjKJ+3wemqV9ISMil1+nFOaWQfa2WWOphKS+rmlDTGoKs0lSz4K+scpZ4mMib1wgGzHRygLmu5Hk5iAb3IhnVmxHGcegMRzFccwal/PRNcBN9zqSJkSepsrygbERhxf2i6h5WWs2VZI52lA9zfLBlf5ASp+1YjkQvirADdGsgSgX4G3nTTFFcPGoSN73W0+lzAgR2DUigZBmyKzW4ZNT4B/DVFNgkUXpVxKB+wC+CvYRhxHfRHaPJ29qiUfYBBg0h5LU99F+r7mN2jNAh4S3cEPNkpOqY1Mbfm5I/ZKmHmoqxwcKli1rmz54XD6s+9GlFOqUt1l/JanmHZcaODtqAt6FzlLJq1Hcw5RyTEBpf8Jf4aAk545Q2rc0L2jkvt9bYaIUmdBVtfWnevt5YFcHDSk1b5ujlbUB8/x4kBL7TqiVucxqe0nYmk4F77UuZlT5/19z1rvDygc7IG6c/qrDPtM6sjnW70rWkE2TVdKPUuC7pWstCmUUaWIjiN0itdSFNrNsuGBaz0PNkBXeWskpIGDa58W42w/tPlPEB/0D4DY+lopbor85YCoOlxak1LARGaagRNL8mAio0GAZSU/MGOvPIq/aXisHYzuLPCVQ1T6mZF2OpYRsnfPB68Csd3+nuBDQJ6gh3ooUmtoWrRYCODKX18vISNwGanA8kuLWSZOC3WcusU9FvLLGrbOmvbOrdu7/vBhNSkbr5l+15qfS87i5wO7ELJgrODhgsw0qmcIIyCUdoX6w8464tsLaGvIIvejjkDf4lPtaOuvbuuvXvr9v5bJkxKbmwd001SC/Y3ByCIOUUZSnYMfWc4Z52lkDaFgyszSmPTkuPaOueSlpIMYEjzskxYHw0Hs6TKA6W7DmiebKJ+8uz6ybO37hi4ZWJDpbmkDE2Lm7OSXIPvCOyjkbpTRZbknBcQYOIlCVbqkp6V9TTjaE6BOgACUfBJw7S5DdPmvrNz8NbaxkpzSRlWC7K9IskbL9TMskycRmvKS0WAD9hCgCRYETqlCOw0gvOwTKosbSkCS6kq0DRjftOM+dt2DdXUNVWaSwmhbzsvB2XrhEmd1TnrkHj2MbjdfENhf/3GAw4ilaOpIrR29rR29vT2jdxW3wLcfMsaJqGAR4qXQ/EdGeYfEVF5tM+6s33Wndv7RydMak1Cn34BrW/N0k9l7BQLfV7n7qznpFecKPWImxpT5vxoypwf7RjYM7GhLW8x+74YdWmkDmI6owHdFgJaAzaXJG/nvWCl0+8lIqICmDb3nmlz79k5uLe2cXLeEqzbRH076HUr+QB/p5Kxg7kXHNC5qYiImwjT5907fd69O4f21TVNobNYtNSufxJiB5AdXyVsZI2/yZ++sjydm4qIuIkw4477Zsz/ya6hfXXNjNQLwH1MVYEloZR6APDVYxnxTeG8NaiFBoyIuFkwY/5PZi64f9fw/vrmqbTvla3sJd0AqXvRYOWKdejcshdbjUNERLkxc8H9HQsf6Bs+UN8yPW8JaNOCHpyadLoBDbN5gZGGwv5gjJPS3bELIyIqiZkLHuhY9GDfyIFJrYzUlY84oEx2DNTCQn8j0Kkcd7lIecE1gXlGkUfc7OhY+EBnz0P9owcb2mbkLfjJRi8C6oYjOMNq/DXBKTfn1SC9sv7O+BERNxE6Fj7Y1fNw/+jBhvaZeQtubqd0geyB0Sl1CSB4QYpgIWVLp5xilqJFRNxE6Fj0YNfih/tHDzW2d+QtuLM10mWfeDiIUiQaN997R7lW8nfeQeBWwjFL5B9Rpbj+VG+74akOHok0iN4oTeFLwev2sfgrs2gSWf4gr9MZIEo9oiRg/6xe6BulJiU3LGBnWDYOO7aMQO1WcEskzjtFc9lF1UXcjJi54P6Oheg78NZY8yhz9n1hlQRrrfPKwDw1KYAn8JeMUe0RNx2MH6GZRmeBhlkj+9BLRQlYgZWCxKHixCIibEyb92PwM/AREREZwdTb7556+907B/fWNrZXmktERETJ0D5rSfusJTsGdhd+Xz0iIiJ7+D/1FVr4aT8L5wAAAABJRU5ErkJggg==" alt="" />
因为,主线程PulseEvent之后,某个线程Wait到这个事件,而它在WaitForSingleObject并未ResetEvent,所以事件还是触发状态,其它的正在Wait的子线程仍可以Wait到,所以激活了全部子线程。
参考:http://blog.csdn.net/morewindows/article/details/7445233
- 线程同步四:信号量(Semaphore)
CreateSemaphore
HANDLE WINAPI CreateSemaphore(
_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
_In_ LONG lInitialCount,
_In_ LONG lMaximumCount,
_In_opt_ LPCTSTR lpName
);
函数功能:创建信号量
函数说明:
第一个参数表示安全控制,一般直接传入NULL。
第二个参数表示初始资源数量。
第三个参数表示最大并发数量。
第四个参数表示信号量的名称,传入NULL表示匿名信号量。
OpenSemaphore
HANDLE WINAPI OpenSemaphore(
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ LPCTSTR lpName
);
函数功能:打开信号量
函数说明:
第一个参数表示访问权限,对一般传入SEMAPHORE_ALL_ACCESS。详细解释可以查看MSDN文档。
第二个参数表示信号量句柄继承性,一般传入TRUE即可。
第三个参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个信号量。
ReleaseSemaphore
BOOL WINAPI ReleaseSemaphore(
_In_ HANDLE hSemaphore,
_In_ LONG lReleaseCount,
_Out_opt_ LPLONG lpPreviousCount
);
函数功能:递增信号量的当前资源计数
函数说明:
第一个参数是信号量的句柄。
第二个参数表示增加个数,必须大于0且不超过最大资源数量。
第三个参数可以用来传出先前的资源计数,设为NULL表示不需要传出。
注意:当前资源数量大于0,表示信号量处于触发,等于0表示资源已经耗尽故信号量处于末触发。在对信号量调用等待函数时,等待函数(WaitForSingleObject)会检查信号量的当前资源计数,如果大于0(即信号量处于触发状态),减1后返回让调用线程继续执行。一个线程可以多次调用等待函数来减小信号量。
CloseHandle
最后一个 信号量的清理与销毁.由于信号量是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。
在经典多线程问题中设置一个信号量和一个关键段。用信号量处理主线程与子线程的同步,用关键段来处理各子线程间的互斥。举例:
#include <stdio.h>
#include <windows.h>
long g_nNum;
const int THREAD_NUM = ;
//信号量与关键段
HANDLE g_hThreadParameter;
CRITICAL_SECTION g_csThreadCode; DWORD WINAPI ChildThread(LPVOID lpParam)
{
int nThreadNum = *(int *)lpParam;
ReleaseSemaphore(g_hThreadParameter, , NULL);//信号量++ 变为1,主线程中的WaitForSingleObject
//才能Wait到信号量,从而继续的执行 Sleep(); EnterCriticalSection(&g_csThreadCode);
++g_nNum;
Sleep();
printf("线程:%d 资源:%d\n", nThreadNum, g_nNum);
LeaveCriticalSection(&g_csThreadCode);
return ;
} int main()
{
//初始化信号量和关键段
g_hThreadParameter = CreateSemaphore(NULL, , , NULL);//初始0个资源,最大允许1个同时访问
InitializeCriticalSection(&g_csThreadCode); HANDLE handle[THREAD_NUM];
g_nNum = ;
int i = ;
while (i < THREAD_NUM)
{
handle[i] = (HANDLE)CreateThread(NULL, , ChildThread, &i, , NULL);
WaitForSingleObject(g_hThreadParameter, INFINITE);//等待信号量>0
++i;
}
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); DeleteCriticalSection(&g_csThreadCode);
CloseHandle(g_hThreadParameter);
for (i = ; i < THREAD_NUM; i++)
CloseHandle(handle[i]); system("pause");
return ;
}
aaarticlea/png;base64,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" alt="" />
CreateSemaphore的第二个参数位0,第三个参数为1,表示信号量初始为0,最多允许1个线程同时访问。主线程中CreateThread之后,信号量个数为0,所以主线程只能一直Wait,直到子线程中有一个ReleaseSemaphore是的信号量个数加1大于0,
这时主线程才能Wait到信号量,且自动减1。而后边主线程如果再想执行,也必须要等到其它子线程先ReleaseSemaphore才行。
可以看出来,信号量也可以解决线程之间的同步问题。
参考:http://blog.csdn.net/morewindows/article/details/7481609
Windows线程同步(下)的更多相关文章
- windows线程同步
一.前言 之前在项目中,由于需要使用到多线程,多线程能够提高执行的效率,同时也带来线程同步的问题,故特此总结如下. 二.windows线程同步机制 windows线程同步机制常用的有几种:Event. ...
- Windows线程同步(上)
先介绍一个创建线程的API,参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx ...
- windows线程同步的总结
一 线程 1)如果你正在编写C/C++代码,决不应该调用CreateThread.相反,应该使用VisualC++运行期库函数_beginthreadex,退出也应该使用_endthreadex.如果 ...
- 关于windows线程同步的四种方法
#include "stdafx.h" #include "iostream" #include "list" #include " ...
- windows线程同步的几种方式
以下为main函数的测试代码 具体线程同步的实现代码请下载:https://github.com/kingsunc/ThreadSynchro #include <stdio.h> #in ...
- windows 线程同步
Windows 临界区,内核事件,互斥量,信号量. 临界区,内核事件,互斥量,信号量,都能完成线程的同步,在这里把他们各自的函数调用,结构定义,以及适用情况做一个总结. 临界区: 适用范围:它只能同步 ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- Windows线程+进程通信
一 Windows线程进程 1)定义 按照MS的定义, Windows中的进程简单地说就是一个内存中的可执行程序, 提供程序运行的各种资源. 进程拥有虚拟的地址空间, 可执行代码, 数据, 对象句柄集 ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
随机推荐
- python返回null和空的不同
mysql数据库中有的字段是NULL, 有的字段是空白 写Python脚本,fetchall()得到结果,也是不同. NULL对应的是None, 空白对应的是'' (None, '') 所以根据结果进 ...
- 简单的socket方法
void sockfunc() { WSADATA Ws; WSAStartup(MAKEWORD(,), &Ws); SOCKET hs = socket(AF_INET, SOCK_STR ...
- Learning C# by Developing Games with Unity 5.x(2nd)
项目:https://pan.baidu.com/s/1o7IMcZo using UnityEngine; using System.Collections; namespace VoidGame ...
- 验证码计时 -- UIButton setTitle 闪烁问题解决方案
首先,有各种版本 方法一: 我运用的一种极其简单的版本: 将UIButton的Type 设成 Custom 就不会有闪烁的问题重现 p.p1 { margin: 0.0px 0.0px 0.0px ...
- 调试技术(/proc、/sys、/dev、strace)
一.在/proc中实现文件 当某个进程读取我们的/proc文件时,内核会分配一个内存页,即PAGE_SIZE字节的内存块.驱动程序可以将数据通过这个内存页返回到用户空间. 第一种方法,不采用seq_f ...
- Java缓存框架
JBossCache/TreeCache JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能.缓存数据被自动复制,让你轻松进行Jboss服务器之间的集群工作 ...
- 九章lintcode作业题
1 - 从strStr谈面试技巧与代码风格 必做题: 13.字符串查找 要求:如题 思路:(自写AC)双重循环,内循环读完则成功 还可以用Rabin,KMP算法等 public int strStr( ...
- Linux常用使用技巧
一.如何实时查看linux下的日志 cat /var/log/*.log 如果日志在更新,如何实时查看 tail -f /var/log/messages 还可以使用 watch -d -n 1 ca ...
- js--性能优化(转)
前言 一直在学习javascript,也有看过<犀利开发Jquery内核详解与实践>,对这本书的评价只有两个字犀利,可能是对javascript理解的还不够透彻异或是自己太笨,更多的是自己 ...
- Hadoop安装教程
单机.伪分布式:http://dblab.xmu.edu.cn/blog/install-hadoop/ 集群:http://dblab.xmu.edu.cn/blog/install-hadoop- ...