线程同步的潜在问题
来源:互联网 发布:开放式婚姻 知乎 编辑:程序博客网 时间:2024/05/16 09:38
有一次在项目中遇到一个问题, 发现有些线程始终得不到运行,
而有些线程早已运行了很多次, 于是我猜测是否是因为抢锁不均匀导致的.
于是写了一下测验代码, 经过验证, 确实存在这个问题.
下面的例子说明, 当等锁的线程达到几百个的时候,
很容易导致有些线程很长的时间都抢不到锁, 而有些线程却反复的获得锁.
使用task队列+线程池的方式来运行, 可以改善这个问题.
static void dbg_printf(const char *format, ...){ char StrBuf[512]; va_list ap; va_start(ap, format); _vsnprintf_s(StrBuf, sizeof(StrBuf), format, ap); va_end(ap); OutputDebugStringA(StrBuf);}CRITICAL_SECTION g_cs;static unsigned int WINAPI ThreadFunc(LPVOID inThread){ for(int i = 0; i < THREAD_RUN_TIME; ++i) { DWORD tick = GetTickCount(); dbg_printf("[tick:0x%08x][tid:%08x][enter lock]\r\n", tick, GetCurrentThreadId()); EnterCriticalSection(&g_cs); dbg_printf("[tick:0x%08x][tid:%08x][enter lock suc:%d]\r\n", tick, GetCurrentThreadId(), GetTickCount()-tick); LeaveCriticalSection(&g_cs); dbg_printf("[tick:0x%08x][tid:%08x][leave lock]\r\n", tick, GetCurrentThreadId()); } return 0;}int _tmain(int argc, _TCHAR* argv[]){ InitializeCriticalSection(&g_cs); for (int nThreadCount = 0; nThreadCount < MAX_THREAD_COUNT; nThreadCount++) { HANDLE hThread = (HANDLE)_beginthreadex( NULL, // Inherit security 0, // Inherit stack size ThreadFunc, // Entry function (void* )nThreadCount, // Entry arg 0, // Begin executing immediately 0 ); CloseHandle(hThread); } getchar(); return 0;}
阅读全文
0 0
- 线程同步的潜在问题
- 线程的同步问题
- 线程同步的问题
- 线程的同步问题
- 线程的同步问题
- 线程的同步问题(java)
- 四、线程的同步问题
- Java线程:线程的同步问题
- Java线程:线程的同步问题
- 操纵股票价格的潜在问题
- 自动变量的潜在问题
- 自动变量的潜在问题
- 关于线程和进程的同步问题
- 生产者消费者模式的线程同步问题
- 关于线程和进程的同步问题
- 线程与进程的同步问题
- java线程同步问题的总结
- Java 关于线程同步的问题
- session和cookie的区别
- Java多线程(PART XXI)多线程和单例模式
- 抛出 net.sf.jasperreports.engine.JRException: Resource not found at: xxx.jasper 异常的解决办法
- 160个CrackMe-第四个“ajj与黑头兄!”
- 配置ionicde 开发环境
- 线程同步的潜在问题
- msp430ADC程序
- java运算符及分支(if switch)
- 30个CSS3选择器的应用
- 有状态的bean和无状态的bean的区别
- 借力大数据、AI,机智云能否在物联网PaaS平台上更胜一筹?
- python 字典按值排序
- linux登录后出现-bash-4.1$,解决办法以及造成这样的原因
- Android中AOP实践之一概念篇