- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Valgrind 告诉我我可能丢失了一些内存时遇到问题:
==23205== 544 bytes in 2 blocks are possibly lost in loss record 156 of 265
==23205== at 0x6022879: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==23205== by 0x540E209: allocate_dtv (in /lib/ld-2.12.1.so)
==23205== by 0x540E91D: _dl_allocate_tls (in /lib/ld-2.12.1.so)
==23205== by 0x623068D: pthread_create@@GLIBC_2.2.5 (in /lib/libpthread-2.12.1.so)
==23205== by 0x758D66: MTPCreateThreadPool (MTP.c:290)
==23205== by 0x405787: main (MServer.c:317)
创建这些线程的代码 (MTPCreateThreadPool) 基本上是获取一个等待 pthread_t 槽 block 的索引,并以此创建一个线程。 TI 成为指向具有线程索引和 pthread_t 的结构的指针。 (简化/ sanitizer ):
for (tindex = 0; tindex < NumThreads; tindex++)
{
int rc;
TI = &TP->ThreadInfo[tindex];
TI->ThreadID = tindex;
rc = pthread_create(&TI->ThreadHandle,NULL,MTPHandleRequestsLoop,TI);
/* check for non-success that I've omitted */
pthread_detach(&TI->ThreadHandle);
}
然后我们有一个 MTPDestroyThreadPool 函数,它循环遍历我们创建的所有线程并取消它们(因为 MTPHandleRequestsLoop 不会退出)。
for (tindex = 0; tindex < NumThreads; tindex++)
{
pthread_cancel(TP->ThreadInfo[tindex].ThreadHandle);
}
我在其他地方(包括关于 SO 的其他问题)读到明确分离线程可以防止这种可能丢失的错误,但显然不是。有什么想法吗?
最佳答案
glibc 的线程实现故意泄漏内存。它将分配给线程上下文的内存缓存起来,以便在下次创建线程时重用。我对没有缓存的实现做了一些基准测试,看起来缓存将 pthread_create
的最佳时间缩短了 50%,但大大减慢了 pthread_join
,对于净亏损。当然,如果您关心的是线程创建延迟而不是吞吐量,这仍然是一个(小) yield 。
另请注意,分离线程很难释放其上下文,即使它想这样做。对于可连接线程,调用 pthread_join
的线程可以释放上下文,但分离线程必须能够在释放其上下文和终止自身之间的间隔期间在没有堆栈的情况下运行。这只能通过用纯 asm 编写一小段代码来实现。
想知道在没有类似竞争条件的情况下分离线程的上下文如何返回到缓存? Linux 具有在线程终止时将特定地址(由用户空间线程库注册)的 int
清零的功能。因此线程可以安全地将自己的上下文添加到缓存中,因为在它终止之前,其他线程仍会在该地址看到一个非零值(通常是它的线程 ID)并将其解释为上下文仍在使用中。
关于c - pthread_create 后跟 pthread_detach 仍然会导致 Valgrind 中可能丢失错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4567765/
我想拦截以\*#\*开头的字符串 后跟一个 0 到 7 之间的数字 并以:##结尾 所以像\*#\*0## 但是我找不到这个的正则表达式 最佳答案 假设你想允许只有一个 # 之前和两个之后,我会这样做
在阅读 C# 代码时,我发现了一个相当奇怪的片段: if( whatever is IDisposable) { (whatever as IDisposable).Dispose(); } 我宁
我在看别人的框架代码,我发现其中一个函数的参数接受了一个输入,输入后面跟着(.),当我检查输入的类型时,我发现它是一个结构不是枚举,这让我很困惑 这是函数的屏幕截图,输入看起来像一个枚举案例: 参数的
我对地址运算符后跟解引用运算符的行为有疑问。 让我们看一下表达式 &*p,其中 p 的类型为 int *。 C11 标准(第 6.5.3.2 节)说: The unary & operator yie
在我的团队中,我经常看到队友在写作 list.filter(_.isInstanceOf[T]).map(_.asInstanceOf[T]) 但这对我来说似乎有点多余。 如果我们知道过滤列表中的所有
请帮我解决这个问题。我已经尝试过删除和重新创建数据文件、刷新表、重新启动数据库和整个服务器。 InnoDB 处于 Force Recovery = 4 >mysql -u root Welcome t
如何使用 Swift3 在 UILabel 末尾添加 UIButton,就像阅读更多一样? 我已经使用 Storyboard创建了 UILabel 和 UIButton。 我不想使用任何 Pod
所以我即将将我的服务器迁移到新机器。我在新机器上安装较新版本的mysql 5.7.13,而旧版本的mysql 5.5.13。有一个查询不像以前那样工作与之前的服务器数据相同 select * fr
在 Andrei Alexandrescu 关于错误处理的演讲中: 见 C++ and Beyond 2012: Andrei Alexandrescu - Systematic Error Hand
我指的是本教程 http://www.tldp.org/LDP/abs/html/sha-bang.html#AEN226在 bash 上进一步提高我的知识,但我似乎无法使用网站中提到的脚本命令删除我
我正在尝试为允许 string 的对象编写类型s 作为键和 function s 带有任意数量的参数,后跟作为值的回调。 // non working dummy code type MyObject
我刚刚用 c 语言编写了一个使用命令行参数的程序,我试图打印第一个参数。当我使用以下命令执行程序时 ./a.out $23 并尝试使用下面的代码打印第一个参数 printf("%s", argv[1]
申请 UILongPressGestureRecongnizer一方面, 检查下面的代码以供引用.. @interface ViewController () { UIRotationGes
我正在使用 MPI 和 C 进行编程,并且使用根等级从文件中读取数据,然后将其分发到其余等级。我的 MPI_Scatter 工作正常,我打印出这些值以确保它们是正确的(而且确实如此)。我的问题是,分配
每当“Tskb”作为单个单词出现时,我必须使用 Java 正则表达式将“Tskb”转换为“TsKB”。我写了下面不起作用的代码。 public class TestBGR { priv
我有下面的代码(注意,我稍后会在循环中添加更多代码,但我需要它先工作): var calls_on = true; function hunt(max, ext, duration){ if(
在我的非根 VC 类中,我有以下 doLogout 方法: - (void)doLogout { SDPAppDelegate *app = [self getAppDelegate];
我的数据库中有很多地址。示例:1199 国道 218 我想选择起始数字,后跟第一个单词,并忽略地址的其余部分。所以我想通过调用这个来检索地址:1199 State 感谢您的帮助 最佳答案 如果您运行的
我正在创建一些客户端套接字软件来从服务器读取事件。 (例如,流媒体股票报价)。 问题: .read(b); 立即返回值-1。这会导致无限循环,手机会变得很热。此外,对 s.isConnected()、
我这里有这段代码: var fields = row.split(/regex goes here/); 我想在每次出现时分割行 | 但不是 *| 如何编写这个简单的正则表达式。我认为有一个不是字符,
我是一名优秀的程序员,十分优秀!