如何解决gettid为两个不同的线程返回相同的值?
我有一个由我的教授编写的程序(我对其进行了一些修改以测试内容)。据我了解,在Linux系统上:
-
用户线程无法利用多核系统,而内核线程却可以。由于pthread可以利用多核系统,因此它是内核线程
-
gettid
返回内核分配的ID,并且由于线程运行在不同的内核上而应该是唯一的。pth_self
返回进程中的ID
我期望为gettid
看到2个不同的值,但这就是我得到的:
代码:
void *count(void *arg) {
printf("pth_self : %d gettid() : %i \n",pth_self(),gettid());
}
int main(int argc,char **argv) {
pth_init();
pth_t t1,t2;
t1 = pth_spawn(PTH_ATTR_DEFAULT,count,&a);
t2 = pth_spawn(PTH_ATTR_DEFAULT,&a);
pth_join(t1,NULL);
pth_join(t2,NULL);
return 0;
}
输出:
pth_self : 23023312 gettid() : 45868
pth_self : 23090368 gettid() : 45868
为什么gettid为2个线程返回相同的东西?如果这很重要,我还会收到有关某种“隐式声明”的警告。
谢谢
解决方法
首次使用clone
和futex
系统调用(请参阅here)。线程是内核已知的,可以利用SMP系统。
第二个在用户空间中完成所有操作:内核仅看到一个线程,因此gettid()
将在所有“线程”中返回相同的值。
您可能会问:“如果pth不创建真实线程,为什么会存在?”
答案是here:
Pth可以提高事件驱动型应用程序的响应能力和并发性,但不能提高数字处理应用程序的并发性。
要为不同的线程使用不同的tid值,您必须将代码更改为:
/* compile with -pthread */
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <pthread.h>
/* see NOTES of https://linux.die.net/man/2/gettid for explanation */
#define gettid() syscall(SYS_gettid)
void *count(void *arg) {
printf("pthread_self : %ld gettid() : %li \n",pthread_self(),gettid());
return NULL;
}
int main(int argc,char **argv) {
pthread_t t1,t2;
pthread_create(&t1,NULL,count,NULL);
pthread_create(&t2,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}
输出:
pth_self : 140492392244992 gettid() : 4422
pth_self : 140492383852288 gettid() : 4423
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。