TLS 线程局部变量, 网上一堆文章说比用锁要好, 为什么我测试了后和 CRITICAL_SECTION 差不多呢

Sandrer Sandrer 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
之前开发的程序一直在用 TLS, 各线程玩各自的东西
但这段时间要优化一个服务端程序, 就想着能不能再优化一下 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");
}
...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部
Sandrer
进程/线程/DLL 15,465 成员 49,169 内容