在适当的时候,我一直在将我的代码从std :: map切换到std :: unordered_map.使用std :: map,我通常会编写以下代码以确保无法修改密钥:
std::map<const std::string, int>
Run Code Online (Sandbox Code Playgroud)
坦率地说,我从未检查过这个const是否具有任何价值.这总是编译和使用g ++.
现在,使用std :: unordered_map,以下内容无法与g ++ 4.5.1链接.
std::unordered_map<const std::string, std::string> m;
m["foo"] = "bar";
Run Code Online (Sandbox Code Playgroud)
有这个链接错误:
未定义的符号:
std::map,引自:
修复很简单,删除const,但除此之外,在STL中是否还有一个点使用任何关联容器类来使用const键类型?是否没有方法可以让您获得任何关联类型的键的引用?
我们有一个C++共享库,它使用ZeroC的Ice库来实现RPC,除非我们关闭Ice的运行时,否则我们观察到子进程挂在随机互斥锁上.Ice运行时启动线程,具有许多内部互斥锁并保持打开文件描述符到服务器.
另外,我们有一些我们自己的互斥体来保护我们的内部状态.
我们的共享库被数百个内部应用程序使用,因此我们无法控制进程何时调用fork(),因此我们需要一种方法来安全地关闭Ice并在进程分叉时锁定我们的互斥锁.
在pthread_atfork()上阅读关于处理互斥锁和内部状态的POSIX标准:
或者,某些库可能只能提供一个子例程,它将库中的互斥锁和所有关联状态重新初始化为某个已知值(例如,最初执行映像时的状态).但是,这种方法是不可能的,因为如果互斥锁或锁仍然被锁定,则允许实现失败*_init()和*_destroy()调用互斥锁和锁.在这种情况下,子例程无法重新初始化互斥锁和锁.
在Linux上,此测试C程序从子pthread_atfork()处理程序中的pthread_mutex_unlock()返回EPERM.Linux需要将_NP添加到PTHREAD_MUTEX_ERRORCHECK宏以便进行编译.
这个程序是从这个好的线程链接的.
鉴于在解锁或破坏子进程中的互斥锁在技术上是不安全或合法的,我认为最好有指向互斥锁的指针,然后让子进程在堆上创建新的pthread_mutex_t并让父进程的互斥锁独立,从而拥有小内存泄漏.
唯一的问题是如何重新初始化库的状态,我正在考虑重新设置pthread_once_t.也许是因为POSIX有一个pthread_once_t的初始化程序,它可以重置为初始状态.
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
static pthread_once_t once_control = PTHREAD_ONCE_INIT;
static pthread_mutex_t *mutex_ptr = 0;
static void
setup_new_mutex()
{
    mutex_ptr = malloc(sizeof(*mutex_ptr));
    pthread_mutex_init(mutex_ptr, 0);
}
static void
prepare()
{
    pthread_mutex_lock(mutex_ptr);
}
static void
parent()
{
    pthread_mutex_unlock(mutex_ptr);
}
static void
child()
{
    // Reset the once control.
    pthread_once_t once = PTHREAD_ONCE_INIT;
    memcpy(&once_control, &once, sizeof(once_control));
}
static void
init()
{
    setup_new_mutex();
    pthread_atfork(&prepare, &parent, &child); …Run Code Online (Sandbox Code Playgroud) 我希望能够使用this.type来定义一个创建不可变案例类的新实例的方法.像这样的东西:
trait Expression
{
  def left : Expression
  def right : Expression
  def new_with_changes(l : Expression, r : Expression) : this.type
}
case class Derived(left : Expression, right : Expression)
{
  def new_with_changes(l : Expression, r : Expression) : this.type =
  {
    new Derived(left, right)
  }
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,编译器抱怨
test.scala:13: error: type mismatch;
 found   : Derived
 required: Derived.this.type
    new Derived(left, right)
    ^
one error found
Run Code Online (Sandbox Code Playgroud)
为什么新案例类与this.type不匹配?
如果我将this.type更改为Base.new_with_changes中的Base并且Derived.new_with_changes中的Derived可以工作,但似乎它错过了this.type的精确性.
编辑:问题的真正意图是为什么在Scala中没有一个等效的方式来声明down的调用者执行downcast,就像this.type那样,但是对于一般类型.我认为这不容易,但它会很好.
除了谷歌提供的相当简短的风格指南,这里是我对命名Google协议缓冲区消息的想法.
在消息类型名称末尾使用"消息".
对于Java用户来说,似乎已经java_outer_classname结束了Protos标准.
com.example.project.protobuf.MyProtos,但我没有理由将它保留在那里,因为我们需要一个包含类,所以它可以被移动到com.example.protobuf.MyProtos除非没有类该项目的顶级包.从0开始枚举以匹配C/C++.
对重复字段使用单数名称.
人们使用或不同于这些标准吗?
我之前得出的结论是,如果你需要一个基于值(等于)相等的SoftReference,那么一个设计不好,除了这个内容之外.这是关注Google Collections和Guava不包括这样的类.但我遇到了一个我认为可以使用这样一个对象的问题.
我们在视觉效果渲染场中有一个资产管理系统,其中100个进程运行相同的作业,只有它渲染的帧数不同.我们有一个Oracle数据库需要记录所有使用的资产.在中间层资产管理系统中,我们可以使用HashSet来记录是否将插入到Oracle中的对象,而不是使用相同的插入来冲击Oracle,其中只有一个将从所有作业中成功.
我可以使用过期的Google MapMaker,但我不想担心过期是正确的,我们会在几小时内和几天内渲染.使用等于等于的SoftReference听起来是一种更好的方式,因此JVM将自动管理垃圾收集.
对于我想用ConcurrentHashMap和垃圾收集解决的其他问题,我会在HashMap中使用强引用作为获取equals()相等性的关键,并使用SoftReference作为值,以便JVM可以垃圾收集内容,但是在此在这种情况下,值无关紧要,我没有在SoftReference中包装的值.所以似乎使用带有equals()的SoftReference就可以了.
还有其他建议吗?
为什么这个Scala代码:
class Test
{
  def foo: (Int, String) =
  {
    (123, "123")
  }
  def bar: Unit =
  {
    val (i, s) = foo
  }
}
Run Code Online (Sandbox Code Playgroud)
生成以下字节码bar(),构造一个新的Tuple2,将Tuple2from 传递foo()给它,然后从中获取值?
public void bar();
Code:
 0:   aload_0
 1:   invokevirtual   #28; //Method foo:()Lscala/Tuple2;
 4:   astore_2
 5:   aload_2
 6:   ifnull  40
 9:   new     #7; //class scala/Tuple2
 12:  dup
 13:  aload_2
 14:  invokevirtual   #32; //Method scala/Tuple2._1:()Ljava/lang/Object;
 17:  aload_2
 18:  invokevirtual   #35; //Method scala/Tuple2._2:()Ljava/lang/Object;
 21:  invokespecial   #20; //Method scala/Tuple2."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
 24: …Run Code Online (Sandbox Code Playgroud) 我们有一个Scala服务器,它通过套接字使用Protocol Buffers获取节点树,我们需要将附加数据附加到每个节点.
在单线程上下文中,当节点树和关联数据同时删除其强引用时(由于超出范围),有没有理由使用带有weakKeys()的Google Guava的MapMaker而不是使用WeakHashMap ?似乎使用MapMaker,可以支付同步访问权限,在这种情况下不需要.
顺便说一下,如果MapMaker允许访问等价设置,那么可以选择引用相等但不关心弱引用或软引用.
我们有一个多线程RPC服务器来解析输入字符串.我们碰到的地方Scala的解析器组合库不是多线程安全的问题:在var lastNoSuccess Parsers.scala用于任何解析.我们在这一行中得到一个NullPointerException
if (!(lastNoSuccess != null && next.pos < lastNoSuccess.next.pos))
Run Code Online (Sandbox Code Playgroud)
通过创建扩展其中一个解析器的对象来实现解析器的默认方式,但是我想按需构造解析器,因此每个解析器都有自己的内部状态,因此我使用的是类而不是对象.但是,由于我需要对结果进行模式匹配,因此我无法编译它:
import scala.util.parsing.combinator.RegexParsers
class SqlParserImpl
  extends RegexParsers
{
  val term: Parser[String] = """(?i)term\b""".r
}
object Test
{
  def main(args: Array[String]): Unit =
  {
    val parser = new SqlParserImpl
    parser.parseAll(parser.term, "term") match {
      // How do I match?
      case SqlParserImpl#Success(result, _) => true
      case SqlParserImpl#NoSuccess => false
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
失败了
t.scala:16: error: '=>' expected but '#' found.
          case SqlParserImpl#Success(result, _) => true
                            ^
t.scala:17: error: '=>' expected but …Run Code Online (Sandbox Code Playgroud) 我们在企业环境中使用LDAP身份验证的新gerrit 2.2.1服务器.我们还有一个作为本地UNIX jenkins用户运行的Jenkins服务器,我希望用gerrit检查并将构建结果发布到gerrit中.
我们没有"jenkins"LDAP帐户,即使我们这样做,系统组也没有为系统帐户提供密码,因此我无法进入Web界面,创建帐户并添加jenkins的publich ssh键.我怎么能添加一个"詹金斯"帐户来珍惜詹金斯可以使用?我们已经有很多人在Gerrit注册,所以我需要小心任何操作.
我正在将Scala Migrations项目从ant/ivy转移到sbt.它可选地使用log4jdbc作为库依赖项,这在任何公共Maven存储库中都不存在(从我能找到的).
libraryDependencies +=
  "log4jdbc" % "log4jdbc" % "1.1" from "http://log4jdbc.googlecode.com/files/log4jdbc4-1.1.jar"
Run Code Online (Sandbox Code Playgroud)
我希望生成的POM不包含log4jdbc,因为它不在任何存储库中.这是一个正确的假设,即如果不列出log4jdbc,POM会更好吗?此外,对于使用sbt的Scala Migrations用户,是否会更好地列出它?
我编写了以下设置来从POM中删除log4jdbc依赖项.有更好,更简单的方法吗?是否可以将设置添加到sbt以自动执行此操作?
// Do not include log4jdbc as a dependency.
pomPostProcess := { (node: scala.xml.Node) =>
  val rewriteRule =
    new scala.xml.transform.RewriteRule {
      override def transform(n: scala.xml.Node): scala.xml.NodeSeq = {
        val name = n.nameToString(new StringBuilder).toString
        if (name == "dependency") {
          if ((n \ "groupId").text == "log4jdbc")
            scala.xml.NodeSeq.Empty
          else
            n
        }
        else {
          n
        }
      }
    }
  val transformer = new scala.xml.transform.RuleTransformer(rewriteRule)
  transformer.transform(node)(0)
}
Run Code Online (Sandbox Code Playgroud) 比较术语"memoize"和"cache"以及阅读Wikipedia的memoization条目,人们是否同意使用术语"memoize"暗示
如果你正在做除上述之外的其他事情,那么一个人只是缓存结果?
我们正在尝试使用Linux,Solaris等使用的共享库命名约定在Mac OS X上使用CMake构建共享库,libfoo.so.1而不是libfoo.1.dylib.这是针对我们现有Linux部署的内部部署,并且希望在其后对Mac OS X部署进行建模,以便不必修改其他工具.
我能够改变.so到.dylib使用
set_target_properties(OpenImageIO
                      PROPERTIES
                      SUFFIX .so)
Run Code Online (Sandbox Code Playgroud)
但是,我无法正确排序.试
set_target_properties(OpenImageIO
                      PROPERTIES
                      OUTPUT_NAME libOpenImageIO.so.${SOVERSION})
Run Code Online (Sandbox Code Playgroud)
结束了build/macosx/libOpenImageIO/liblibOpenImageIO.so.32.1.2.0.so,这表明OUTPUT_NAME是只对共享库的基部和CMake的将总是反向SUFFIX和VERSION顺序.
我搜索了CMake的源代码,无法找到此代码的设置位置.
我编写了一个名为Cache [A,B]的Scala特征来提供缓存API.Cache具有以下方法:asyncGet(),asyncPut(),asyncPutIfAbsent(),asyncRemove().
我将有一些静态方法,例如getOrElseUpdate(key:A)(op:=> B).我不希望像Cache这样的方法在Cache trait中作为抽象defs,因为我不希望每个Cache实现都必须为它提供一个实现,当它可以使用async*()方法编写一次时.
在查看Google Guava和Java库的一部分时,他们将公共静态函数放在一个接口名称的复数类中,因此"Caches"将是我将使用的名称.
我实际上喜欢这个命名方案,即使我可以使用Cache伴随对象.在查看我的大部分代码时,我的许多伴随对象都包含私有val或def,因此我的API用户需要查看伴随对象以查看可以从那里使用的内容或任何相关内容.
通过使一个名为"Caches"的对象与Java一致,并且还清楚地表明那里只有公共函数.我倾向于使用"对象缓存"而不是"对象缓存".
那人们怎么想?
scala ×5
guava ×2
java ×2
c ×1
c++ ×1
cmake ×1
concurrency ×1
gerrit ×1
ice ×1
memoization ×1
pthreads ×1
sbt ×1
stl ×1
tuples ×1
weakhashmap ×1