我想知道如何配置pthread互斥锁以查看我的代码中是否存在任何锁定争用点.(谁喜欢有争议的代码,对吧?:)我知道如何对代码进行更一般的分析,正如我在这里提到的那样.但我想知道是否有任何工具或选项可用于配置互斥锁定,这将提供有关互斥锁定争用的指标/统计数据,以查看我是否有任何问题区域.
这是一些背景和背景:
最近我使用Cavium Octeon CPU开发了一个嵌入式C++项目.Octeon SDK使用自旋锁实现互斥式样式同步.通过Octeon文档,我发现了一种分析自旋锁的方法,以便能够看到每个自旋锁在等待锁变为可用时必须旋转多少次.要使用它,我必须进行条件编译,然后每次自旋锁旋转时它会递增一个计数器,然后我可以查询微调器等待值.所以,我所做的是封装自旋锁并添加了为系统中使用的所有自旋锁转储自旋锁微调器等待值的功能.实际价值并没有多大意义,但有一些与其他人相比具有非常高的价值,我专注于减少对这些人的争论.
我知道这对于自旋锁来说可能相当容易,因为它只是每次旋转一个计数器,但通过相关的pthread手册页和头文件读取我没有找到类似的东西,是否有可用于pthread互斥锁?
我真的很想避免像每个锁之前和之后花时间做一些hacky.
PS:互斥体的复数是多少?互斥,muteces,mutexi,muti ??? 互斥量从来没有对我说话.
现在我正在讨论程序员使用typedef关键字的新类型定义.只要我的学生习惯使用size_t类型(例如使用funciton length()),我必须要求他们稍微努力才能"相信"它是一个整数类型,我认为它会很棒显示noew定义此类型的位置.
所以,我在/ usr/include中已经在ubuntu框中做了很多grep,而我看到的是size_t反过来又是对size_type的重新定义,而这又是对metadata_type的重新定义,这就是目录.找不到最终的"typedef unsigned int metadata_type;".
在/ usr/src我找到了anohter以前的类型叫yy_size_t,...
但是,无论如何我都无法走到链的尽头.
有谁知道在哪里找出最终的定义来检查它是无符号的int(或类似的)?可能我想念我的盒子里的开发包吗?在这种情况下,为什么我能够使用size_t类型编译程序?
我正在寻找一个低影响,os独立的c ++代码剖析器.
当我说低影响时,我指的是比valgrind更少侵入性的东西.我计划在基于MIPS的嵌入式环境中使用它(因此os-independance)并尝试了valgrind的移植版本,它完全改变了性能特征(Heisenberg工作原理太多了)所以我不能走这条路.我们知道内存总线速度是一个瓶颈,这很可能解释了为什么valgrind如此具有侵入性.
我已经创建了一个基于检查点的自制类型的探查器,可以让我测量代码的某些部分.基本上我必须修改代码(并重新编译)以在代码中的战略位置设置检查点.然后,执行时,它会存储每个检查点被击中的次数以及自上次检查点被击中以来的时间.然后,在运行之后,我可以转储检查点,并为每个检查点计算:num-hits,max-time,min-time,avg-time等.
这个探查器(我称之为LowImpactProfiler)工作正常,但我想知道是否有更好的东西.
我考虑过oProfile,这是一个抽样分析器,但由于我没有运行Linux,我认为实施起来真的很难.
我有一个应用程序,我必须在多线程方法中增加一些统计计数器.递增必须是线程安全的,所以我决定使用gcc atomic builtins __sync_add_and_fetch()函数.为了了解它们的影响,我做了一些简单的性能测试,发现这些函数比简单的前/后递增慢得多.
这是我创建的测试程序:
#include <iostream>
#include <pthread.h>
#include <time.h>
using namespace std;
uint64_t diffTimes(struct timespec &start, struct timespec &end)
{
if(start.tv_sec == end.tv_sec)
{
return end.tv_nsec - start.tv_nsec;
}
else if(start.tv_sec < end.tv_sec)
{
uint64_t nsecs = (end.tv_sec - start.tv_sec) * 1000000000;
return nsecs + end.tv_nsec - start.tv_nsec;
}
else
{
// this is actually an error
return 0;
}
}
void outputResult(const char *msg, struct timespec &start, struct timespec &end, uint32_t numIterations, uint64_t val)
{
uint64_t …Run Code Online (Sandbox Code Playgroud) 我有一个多线程应用程序,它创建了48个线程,所有这些线程都需要访问公共属性(stl :: map).地图将仅在线程开始时写入,其余时间将从中读取地图.这似乎是pthread_rw_lock的完美用例,并且似乎都运行良好.
我碰到了一个完全不相关的seg-fault并开始分析核心.使用gdb,我执行了命令info threads并对结果感到非常惊讶.我观察到几个线程实际上是按照预期从地图中读取的,但奇怪的是,在pthread_rwlock_rdlock()中等待rw_lock的几个线程被阻塞了.
以下是等待锁定的线程的堆栈跟踪:
#0 0xffffe430 in __kernel_vsyscall ()
#1 0xf76fe159 in __lll_lock_wait () from /lib/libpthread.so.0
#2 0xf76fab5d in pthread_rwlock_rdlock () from /lib/libpthread.so.0
#3 0x0804a81a in DiameterServiceSingleton::getDiameterService(void*) ()
Run Code Online (Sandbox Code Playgroud)
有这么多线程,很难说有多少是在阅读,有多少是被阻止的,但我不明白为什么任何线程都会被阻塞等待阅读,考虑到其他线程已经在阅读.
所以这是我的问题:当其他线程已经从中读取时,为什么有些线程被阻塞等待读取rw_lock?似乎可以同时读取的线程数有限制.
我看了看pthread_rwlock_attr_t功能,没看到任何相关的东西.
操作系统是Linux,SUSE 11.
这是相关的代码:
{
pthread_rwlock_init(&serviceMapRwLock_, NULL);
}
// This method is called for each request processed by the threads
Service *ServiceSingleton::getService(void *serviceId)
{
pthread_rwlock_rdlock(&serviceMapRwLock_);
ServiceMapType::const_iterator iter = serviceMap_.find(serviceId);
bool notFound(iter == serviceMap_.end());
pthread_rwlock_unlock(&serviceMapRwLock_);
if(notFound)
{
return NULL;
}
return iter->second;
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Swagger代码源创建要在Spring REST服务器中使用的Java模型,并且想知道如何获取Swagger来将每个模型声明为JPA实体。
我使用以下代码生成代码swagger-codegen-maven-plugin:
<plugin>
<groupId>io.swagger</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>2.4.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/openApi/Rack.json</inputSpec>
<language>spring</language>
<groupId>com.me</groupId>
<artifactId>rest-server</artifactId>
<apiPackage>com.me.rest.api</apiPackage>
<modelPackage>com.me.rest.model</modelPackage>
<invokerPackage>com.me.rest.invoker</invokerPackage>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
<java8>true</java8>
<dateLibrary>java8</dateLibrary>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
现在,这是生成的缩写Java代码:
@Validated
@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "...")
public class Rack {
@JsonProperty("id")
private Long id = null;
@JsonProperty("name")
private String name = null;
...
}
Run Code Online (Sandbox Code Playgroud)
如何获取Swagger来添加@Entity和@Id JPA批注,如下所示?
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Validated
@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "...")
public class Rack {
@Id
@JsonProperty("id")
private Long id …Run Code Online (Sandbox Code Playgroud)