- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下小代码片段:
int main()
{
pthread_t t = pthread_self();
std::cout << t << std::endl;
return 0;
}
当我在没有任何库的情况下使用 g++ 4.9.2 在 Linux 上编译+链接时,输出为:
0
当我如下链接 pthread 时:
g++ test.c -o test -lpthread; ./test
输出是:
139675118393152
当与 -lpthreads 链接时,我能否获得从实际 POSIX 线程 ID 到线程唯一索引的映射?我想要一个具有某些线程特定值的全局数组,并且需要使用线程 id 作为数组索引,无法处理 139675118393152,例如,需要将其映射到 1、2 等
最佳答案
大致如下:首先,如pthread_self()
在标准 C 库中实现,它不需要链接到 -lpthreads
。 .
现在,pthread_self()
使用一个全局变量,一个指向 TCB(线程控制 block )的指针,来存储线程信息,包括 ID(在进程中是唯一的)。
此指针初始化为 NULL (0),但 Pthreads 库(链接时)更改了它,因此它现在指向当前线程头结构。
这就是为什么在不链接 Pthreads 时得到 0 而在链接时得到实际 POSIX 线程 ID 的原因。
自定义线程 ID
您可以在创建时为每个线程分配一个自定义 ID,并将该值用作数组的索引。
void* thread_function(void* data) {
assert(data);
const int id = *((int*)data);
// g_array[id]...
}
int main() {
// ...
pthread_t t0;
int t0id = 0; // this variable must exist when the thread starts
pthread_create(&t0, NULL, thread_function, &t0id);
pthread_t t1;
int t1id = 1; // this variable must exist when the thread starts
pthread_create(&t1, NULL, thread_function, &t1id);
// ...
pthread_join(t0, NULL);
pthread_join(t1, NULL);
}
另一种选择可能是使用全局 std::map<pthread_t, int> g_thread_ids
构造并链接来自 pthread_self()
的线程 ID数组索引作为参数传递。您必须注意竞争条件(为简单起见此处省略)。您还应该关心未以这种方式创建的线程的情况(如果可能),因为 pthread_self()
值将不存在于 map 中。
std::map<pthread_t, int> g_thread_ids;
int get_thread_index() { // note: critical section
if (g_thread_ids.find(pthread_self()) == g_thread_ids.end()) return -1;
return g_thread_ids[pthread_self()];
}
void* thread_function(void* data) {
assert(data);
const int id = *((int*)data); // read the index from caller
g_thread_ids[pthread_self()] = id; // note: critical section
// g_array[get_thread_index()]...
}
关于c++ - Linux 上的 pthread_self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471743/
我正在使用 C 学习线程,并发现了以下“Hello World”程序。当我使用 pthread_join() 在线程内和线程外打印 pthread_value() 的值时,两个线程返回的值完全不同。
我学pthread的时候,手册上说pthread_self()总是成功 ERRORS This function always succeeds. 这是怎么发生的?我们如何确定一个函数是否总是成功?
pthread_self() 在 ubuntu 12.04 上是否昂贵? 它是否使用系统调用? 我想在每次线程写入日志时调用 pthread_self(),这样我就知道哪个线程写入日志并在日志中提及它
我想通过我们可以传递给 pthread_self() 的某个函数来获取线程的堆栈地址。是否可以?我这样做的原因是因为我想为它的堆栈中某处的线程编写我自己分配的线程标识符。我可以在堆栈末尾附近写入(堆栈
我有以下小代码片段: int main() { pthread_t t = pthread_self(); std::cout g_thread_ids构造并链接来自 pthread_sel
#include #include #include #include int main(){ int systid=syscall(186); int pt_tid=pthread_
这就是我想知道的: 如果我使用 pthread_create() 创建一个线程,然后从该线程调用 pthread_self(),该值是否与我在主线程中传递给 pthread_create 的 pthr
我正在尝试用 C 实现 pthread_self() 但我对它到底做了什么感到困惑。我知道它返回线程 ID,但该 ID 是一个内存位置,因为它返回一个我不确定如何解释的 pthread_t 。另外,我
我无法让 pthread_equal() 匹配存储的 pthread。与从 pthread_create() 获得的相比,我从 pthread_self() 获得的 pthread_t 似乎被截断了
我正在查看这个示例代码 http://man7.org/linux/man-pages/man3/pthread_setaffinity_np.3.html 在这个例子中,为什么可以在没有 pthre
根据我的理解,gettid()返回的TID(thread id)在一个进程中(或者在一个多进程的程序中,而每个进程可能有多个线程),即在一个进程内,不同的线程有不同的线程id。 pthread_sel
我正在尝试在 for 循环中创建多个线程(代表人员),并显示作为参数传递的人员 ID 以及线程 ID。人员 ID 按预期显示,但线程 ID 始终相同。 #include #include #inc
我正在尝试将 linux 工作应用程序移植到 windows(使用 windows.h 和 POSIX pthread_win32) 因此,我定义了一个客户字段: struct ClientIdent
在 Glibc 的 pthread.h 中,pthread_self 函数是用 const 属性声明的: extern pthread_t pthread_self (void) __THROW __
我正在尝试在 Linux 上设置线程的 CPU 关联。我想知道推荐使用以下哪一种方法: Get thread id using pthread_self() Set CPU affinity usin
背景:我正在开发一个被许多程序使用的日志库。 我正在为每个线程分配一个人类可读的名称,主线程应该是“main”,但我希望能够从库中检测到该状态,而不需要在每个 main() 函数的开头编写代码. 另请
#include #include int main(){ std::cout<
我正在按照“Android NDK 游戏开发指南”中的示例创建跨平台线程包装器,以便在我自己的 Android NDK 游戏引擎中使用。在示例的 Thread 类中,在某个时刻,会检查线程句柄是否对应
我的问题是是否有一个函数返回 pthread_self 和 gettid 以外的线程 ID。 pthread_self 的问题在于它返回一个地址,而 gettid 返回系统范围的全局 tid。我想要相
我正在使用来自 here 的这个 dtrace 脚本尝试查找 Java 程序的线程何时发生上下文切换。 我正在尝试将从脚本中收集的数据与从正在运行的程序中收集的跟踪数据(例如方法进入/退出之类的东西)
我是一名优秀的程序员,十分优秀!