如何声明线程私有全局变量

轻飘风扬 2014-07-14 11:29:11

需要让现在的内存池的代码支持多线程。之前的引擎是只有一个线程在跑,所以内存池被声明成了一个全局的pool,需要内存时就从里面拿,目前的整个cache中所有的节点都是这样获取的,但在多线程环境下,这样显然是有问题的,有可能出现多个线程同时拿的情况。
最直观的解决方法就是加锁,用个mutex或者spinlock锁一下,每次取内存时,先获取锁,但这样带来的加锁的开销,有可能会抵销使用内存池带来的性能提升

目前使用的是这个函数可以实现,但是还是觉得麻烦。

设置"线程相关的数据",使用 int pthread_setspecific(pthread_key_t key, const void *pointer);
读取"线程相关的数据",使用 void * pthread_getspecific(pthread_key_t key);

大家有没有更好的方法?

在线等。。。。
...全文
655 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenkangapple 2014-07-17
  • 打赏
  • 举报
回复
要不然就把内存分成多块,每个线程访问一个memory pool ;
mujiok2003 2014-07-16
  • 打赏
  • 举报
回复
vc 2013

C:\demo\test>type test.cpp
#include <iostream>
#include <thread>
#include <mutex>

std::mutex m;
void foo(int id)
{
  __declspec( thread ) static int i = 0;
  for(; i < 29; ++i)
  {
    std::lock_guard<std::mutex> lock(m);
    std::cout <<id << ":" << i << std::endl;
  }
}

int main() {
  std::thread t1(foo, 256);
  std::thread t2(foo, 237);
  t1.join();
  t2.join();
  return 0;
}

C:\demo\test>cl  /EHsc /MT /Ox /DNDEBUG test.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.30501 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
Microsoft (R) Incremental Linker Version 12.00.30501.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:test.exe
test.obj

C:\demo\test>test
256:0
237:0
256:1
237:1
256:2
237:2
256:3
237:3
256:4
237:4
256:5
237:5
256:6
237:6
256:7
237:7
256:8
237:8
256:9
237:9
256:10
237:10
256:11
237:11
256:12
237:12
256:13
237:13
256:14
237:14
256:15
237:15
256:16
237:16
256:17
237:17
256:18
237:18
256:19
237:19
256:20
237:20
256:21
237:21
256:22
237:22
256:23
237:23
256:24
237:24
256:25
237:25
256:26
237:26
256:27
237:27
256:28
237:28

C:\demo\test>
ma100 2014-07-16
  • 打赏
  • 举报
回复
最简单的就是用现成的, 比如boost
mujiok2003 2014-07-16
  • 打赏
  • 举报
回复
轻飘风扬 2014-07-16
  • 打赏
  • 举报
回复
引用 6 楼 bbs2241 的回复:
[quote=引用 5 楼 jsh13417 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:]
#define MAXTHREADS 2000
POOL pool[MAXTHREADS];

pool[GetCurrentThreadId()%MAXTHREADS]=...;
这个方法不错,非常感谢。。 还是有一个疑问,声明一个全局的pool, 初始化放在线程中,会不会这个pool就是线程的私有全局变量。 在实际开发中测试证明好像是不行的,[/quote] 赵老师逗你玩捏,你居然信了。[/quote]
引用 6 楼 bbs2241 的回复:
[quote=引用 5 楼 jsh13417 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:]
#define MAXTHREADS 2000
POOL pool[MAXTHREADS];

pool[GetCurrentThreadId()%MAXTHREADS]=...;
这个方法不错,非常感谢。。 还是有一个疑问,声明一个全局的pool, 初始化放在线程中,会不会这个pool就是线程的私有全局变量。 在实际开发中测试证明好像是不行的,[/quote] 赵老师逗你玩捏,你居然信了。[/quote] 我信什么 ???? ????
bobo_包子 2014-07-15
  • 打赏
  • 举报
回复
引用 5 楼 jsh13417 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:]
#define MAXTHREADS 2000
POOL pool[MAXTHREADS];

pool[GetCurrentThreadId()%MAXTHREADS]=...;
这个方法不错,非常感谢。。 还是有一个疑问,声明一个全局的pool, 初始化放在线程中,会不会这个pool就是线程的私有全局变量。 在实际开发中测试证明好像是不行的,[/quote] 赵老师逗你玩捏,你居然信了。
轻飘风扬 2014-07-15
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
#define MAXTHREADS 2000
POOL pool[MAXTHREADS];

pool[GetCurrentThreadId()%MAXTHREADS]=...;
这个方法不错,非常感谢。。 还是有一个疑问,声明一个全局的pool, 初始化放在线程中,会不会这个pool就是线程的私有全局变量。 在实际开发中测试证明好像是不行的,
赵4老师 2014-07-14
  • 打赏
  • 举报
回复
#define MAXTHREADS 2000
POOL pool[MAXTHREADS];

pool[GetCurrentThreadId()%MAXTHREADS]=...;
神-气 2014-07-14
  • 打赏
  • 举报
回复
TLS 线程本地存储
zilaishuichina 2014-07-14
  • 打赏
  • 举报
回复
map<DWORD, POOL*> poolmap; DWORD dwThreadId = 0; CreateThread(NULL, 0, ThreadRun, NULL, 0, &dwThreadId); poolmap[dwThreadId] = new POOL(); 全部初始化好之后,设一个信号量,通知各个线程开始ThreadRun 由于在这之后,这个poolmap没有写操作,可以不加锁。
轻飘风扬 2014-07-14
  • 打赏
  • 举报
回复
引用 1 楼 ADF1230 的回复:
TLS 线程本地存储
下面函数应该就是 TLS吧,LINUX下api 设置"线程相关的数据",使用 int pthread_setspecific(pthread_key_t key, const void *pointer); 读取"线程相关的数据",使用 void * pthread_getspecific(pthread_key_t key);

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧