TLS 线程局部变量, 网上一堆文章说比用锁要好, 为什么我测试了后和 CRITICAL_SECTION 差不多呢
之前开发的程序一直在用 TLS, 各线程玩各自的东西
但这段时间要优化一个服务端程序, 就想着能不能再优化一下 TLS 的东西
然后就写了下面的代码, 但运行结果看来, TLS 和 CRITICAL_SECTION 差不多的时间
反而很多时候要比 CS 慢.........................
难道是我打开的方式不对???
但这段时间要优化一个服务端程序, 就想着能不能再优化一下 TLS 的东西
然后就写了下面的代码, 但运行结果看来, TLS 和 CRITICAL_SECTION 差不多的时间
反而很多时候要比 CS 慢.........................
难道是我打开的方式不对???
#include "stdafx.h"
#include <process.h>
static DWORD m_dwTLSIndex = 0;
static CRITICAL_SECTION m_lock;
#define MAX_ALLOCATE 1000000u
static volatile DWORD m_dwAllocCount = 0;
struct BUFFER
{
BUFFER *next;
BYTE data[16];
};
struct BUFFER_LIST
{
BUFFER_LIST *next;
BUFFER *pBuffers;
};
static BUFFER_LIST *m_pBufferList = NULL;
static BUFFER *m_pBuffers = NULL;
uintptr_t __stdcall _thread1(void *)
{
BUFFER *p;
BUFFER_LIST *pList = (BUFFER_LIST *)malloc(sizeof(BUFFER_LIST));
ZeroMemory(pList, sizeof(BUFFER_LIST));
::EnterCriticalSection(&m_lock);
pList->next = m_pBufferList;
m_pBufferList = pList;
::LeaveCriticalSection(&m_lock);
::TlsSetValue(m_dwTLSIndex, pList);
for (;;)
{
p = (BUFFER *)malloc(sizeof(BUFFER));
p->data[0] = 0;
pList = (BUFFER_LIST *)::TlsGetValue(m_dwTLSIndex);
p->next = pList->pBuffers;
pList->pBuffers = p;
if (InterlockedIncrement(&m_dwAllocCount) >= MAX_ALLOCATE)
break;
}
return 0;
}
uintptr_t __stdcall _thread2(void *)
{
BUFFER *p;
for (;;)
{
p = (BUFFER *)malloc(sizeof(BUFFER));
p->data[0] = 0;
::EnterCriticalSection(&m_lock);
p->next = m_pBuffers;
m_pBuffers = p;
::LeaveCriticalSection(&m_lock);
if (InterlockedIncrement(&m_dwAllocCount) >= MAX_ALLOCATE)
break;
}
return 0;
}
void TestTLSData()
{
::InitializeCriticalSection(&m_lock);
ULONGLONG ullBegin, ullEnd;
SYSTEM_INFO si;
::GetSystemInfo(&si);
DWORD dwThread = 0;
DWORD dwCount = si.dwNumberOfProcessors;
HANDLE *phThreads = new HANDLE[dwCount + 1];
ZeroMemory(phThreads, sizeof(HANDLE) * (dwCount + 1));
m_dwTLSIndex = ::TlsAlloc();
::GetSystemTimeAsFileTime((LPFILETIME)&ullBegin);
dwThread = 0;
while (dwCount--)
phThreads[dwThread++] = (HANDLE)_beginthreadex(NULL, 0, _thread1, NULL, 0, NULL);
::WaitForMultipleObjects(dwThread, phThreads, TRUE, INFINITE);
::GetSystemTimeAsFileTime((LPFILETIME)&ullEnd);
printf("Used TLS: %u.%04u ms\n", (DWORD)(ullEnd - ullBegin) / 10000, (DWORD)(ullEnd - ullBegin) % 10000);
while (dwThread--)
::CloseHandle(phThreads[dwThread]);
::TlsFree(m_dwTLSIndex);
BUFFER *n, *p;
//BUFFER_LIST *pNext;
//BUFFER_LIST *pList = m_pBufferList;
//while (pList != NULL)
//{
// pNext = pList->next;
// p = pList->pBuffers;
// while (p)
// {
// n = p->next;
// free(p);
// p = n;
// }
// free(pList);
// pList = pNext;
//}
m_dwAllocCount = 0;
dwCount = si.dwNumberOfProcessors;
ZeroMemory(phThreads, sizeof(HANDLE) * (dwCount + 1));
::GetSystemTimeAsFileTime((LPFILETIME)&ullBegin);
dwThread = 0;
while (dwCount--)
phThreads[dwThread++] = (HANDLE)_beginthreadex(NULL, 0, _thread2, NULL, 0, NULL);
::WaitForMultipleObjects(dwThread, phThreads, TRUE, INFINITE);
::GetSystemTimeAsFileTime((LPFILETIME)&ullEnd);
printf("Not used TLS: %u.%04u ms\n", (DWORD)(ullEnd - ullBegin) / 10000, (DWORD)(ullEnd - ullBegin) % 10000);
while (dwThread--)
::CloseHandle(phThreads[dwThread]);
//p = m_pBuffers;
//while (p)
//{
// n = p->next;
// free(p);
// p = n;
//}
::DeleteCriticalSection(&m_lock);
system("pause");
}
...全文
相关推荐
Windows编程基础测试题
Critical_section(关键段),Event(事件),Mutex(互斥对象),Semaphore(信号量)4. 使用全局变量,使用事件对象,使用消息**简答题答案:**1.
win32多线程vc6.0
**线程同步**:为了防止线程间的竞态条件和死锁,需要使用线程同步机制,如临界区(Critical Section)、互斥量(Mutex)、事件(Event)、信号量(Semaphore)和线程间通信工具
Win32 多线程程序设计(候捷译)
书中会讨论各种同步机制,如临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)等,以及如何使用`WaitForSingleObject`和`
多线程编程10例源码
在`<thread.h>`库中,可以使用`_beginthreadex`创建线程并使用`_tls_index`来分配和访问TLS。6. **线程退出和清理**:当线程函数返回时,线程将自动终止。
易语言源码-模块-线程操作类
同时提供线程同步原语封装,包括临界区(Critical Section)、互斥量(Mutex)、事件(Event)、信号量(Semaphore)等对象的创建、等待、释放与销毁方法,确保多线程环境下共享资源访问的原子性与一致性


进程/线程/DLL
