小编lee*_*777的帖子

如何避免线程+优化器==无限循环?

在今天的代码审查中,我偶然发现了以下一些代码(稍微修改后发布):

while (!initialized)
{
  // The thread can start before the constructor has finished initializing the object.
  // Can lead to strange behavior. 
  continue;
}
Run Code Online (Sandbox Code Playgroud)

这是在新线程中运行的前几行代码.在另一个线程中,一旦初始化完成,它就会设置initializedtrue.

我知道优化器可以将其变成无限循环,但是避免这种情况的最佳方法是什么?

  • volatile- 被认为有害
  • 调用isInitialized()函数而不是直接使用变量 - 这会保证内存障碍吗?如果宣布该功能inline怎么办?

还有其他选择吗?

编辑:

应该早点提到这一点,但这是需要在Windows,Linux,Solaris等上运行的可移植代码.我们主要使用Boost.Thread作为我们的便携式线程库.

c++ multithreading thread-safety compiler-optimization

3
推荐指数
1
解决办法
536
查看次数

Lift的映射器中的外键约束

我在Scala 中使用Mapper创建了一个表.

class Stage extends Mapper[Stage]
{                   
  def getSingleton = Stage             
  object controlId extends MappedLongForeignKey (this,Control) {  
    override def dbNotNull_? = true  
    override def dbColumnName = "control_id"  
  }  
}
Run Code Online (Sandbox Code Playgroud)

但是我的表没有为数据库中的foreignKey键创建约束.

database scala lift mapper

3
推荐指数
1
解决办法
414
查看次数

在子类中扩展 Scala 模式匹配,同时保持复杂性

我有一个 Scala 问题。想象一下您正在构建代码来处理不同的操作,即

operation match {
   case A => doA()
   case B => doB()
   case _ => throw new Exception("Unknown op: " + operation)
}
Run Code Online (Sandbox Code Playgroud)

现在,想象一下,稍后您想要构建一个新版本,并且想要扩展操作 C 的模式匹配。如何以操作分辨率仍然为 O(1) 的方式做到这一点?

我的意思是,我可以修改上面的代码来执行以下操作:

   case _ => handleUnknownOperation(operation)
Run Code Online (Sandbox Code Playgroud)

子类可以实现handleUnknownOperation来执行以下操作:

operation match {
   case C => doC()
}
Run Code Online (Sandbox Code Playgroud)

但这很糟糕,因为这意味着 C 操作需要 O(2)。

扩展这种模式匹配结构的任何其他想法或最佳实践?

干杯,高尔德

complexity-theory scala pattern-matching

3
推荐指数
1
解决办法
2819
查看次数

你能指定一个抽象类型的视图?

这个问题的回答中,我很惊讶以下代码不起作用.

scala> abstract class Foo {
     |  type Repr_Tpe <% Ordered[Repr_Tpe]
     | }

<console>:2: error: `=', `>:', or `<:' expected
Run Code Online (Sandbox Code Playgroud)

OP表示用类型参数替换抽象类型不是一种选择.有没有办法表达一个抽象类型的视图?

scala

3
推荐指数
1
解决办法
266
查看次数

value%不是scala.xml.NodeSeq的成员

我正在尝试使用CSS Selector Transforms来完成一些Lift示例.我正在尝试这种转变:

  • NodeSeq => NodeSeq - 一个转换节点的函数(是的,它可以是一个CssBindFunc): "#name" #> ((n: NodeSeq) => n % ("class" -> "dog")) // <span id="name"/> -> <span id="name" class="dog"/>

这就是%现在给我带来麻烦的.当我尝试编写这样的代码时,我得到了错误value % is not a member of scala.xml.NodeSeq.是否有进口或我缺少的东西?

这是我的片段:

import scala.xml._
import net.liftweb.util.Helpers._

import model.User

class Users {
  def show = {
    ".userName" #> "name replaced" &
    ".userEmail" #> "email replaced" &
    ".changePassword" #> ((n: NodeSeq) => n % ("href" -> "changePassword"))
  }
}
Run Code Online (Sandbox Code Playgroud)

scala lift

2
推荐指数
1
解决办法
1076
查看次数

斯卡拉演员和工人

我正在使用Web服务客户端,他们在第一次调用时速度很慢.而不是总是创建一个全新的,我想使用演员并说5个演员来包装Web服务客户端.由于Web服务客户端不是线程安全的(至少使用我用来生成它们的库),这非常有意义.

我想到有一个父母演员将这个工作交给五个工人,一个接一个地以循环方式.

但最好简单地交给第一个可用的.我可以在父演员中跟踪该状态,但我想知道这样的事情是否可以更简单地完成并且它是否已经被框架支持了?

我使用的是简单的scala演员,而不是AKKA,但我对所有建议持开放态度.

谢谢.

scala actor

2
推荐指数
1
解决办法
409
查看次数

!方法不在Scala中维护换行符

我需要使用scala执行脚本.当我执行Seq使用!新行丢失后的字符串.那就是"这是"字符串在新行丢失后更新为Jira和字符串的另一部分.据我所知,这是应该的!不保持新的路线.任何人都可以建议我如何解决这个问题?请参阅下面的代码.

import scala.sys.process._

val fileContent: String = """ Here is the 

text with 

new line """

Seq("/opt/atlassian-cli-2.6.0/atlassian.sh", "jira", "--action", "updateIssue", "--issue", "JIRA-2",  "--field", "customfield_10664" ,"--values", fileContent).! 
Run Code Online (Sandbox Code Playgroud)

scala

2
推荐指数
1
解决办法
182
查看次数

为什么在Scala中扩展时必须重新定义特征中已定义的变量

我为什么要这么做

trait Compiler {
  var printInstruction: String
}
class JavaCompiler extends Compiler {
  var printInstruction = "System.out.print(arg0);"
}
Run Code Online (Sandbox Code Playgroud)

代替

trait Compiler {
  var printInstruction: String
}
class JavaCompiler extends Compiler {
  printInstruction = "System.out.print(arg0);"
}
Run Code Online (Sandbox Code Playgroud)

什么时候

trait Compiler {
  var printInstruction: String
  def printInstruction: String
}
Run Code Online (Sandbox Code Playgroud)

给出编译错误.

scala

1
推荐指数
1
解决办法
411
查看次数

在Scala中初始化和使用抽象泛型类中的字段

我在scala中有这样的东西:

abstract class Point[Type](n: String){
    val name = n
    var value: Type = _
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.问题出在一个扩展Point的类中.

case class Input[Type](n:String) extends Point(n){
    def setValue(va: Type) = value = va
}
Run Code Online (Sandbox Code Playgroud)

setValue行我有这样的问题:

[error]  type mismatch;
[error]  found   : va.type (with underlying type Type)
[error]  required: Nothing
[error]   def setValue(va: Type) = value = va
Run Code Online (Sandbox Code Playgroud)

我曾尝试与初始化nullnull.asInstanceOf[Type],但结果是一样的.

如何初始化值以便可以在setValue中使用?

generics scala abstract

1
推荐指数
1
解决办法
738
查看次数

使用Scala中的Pattern Matching交换数组中的值

我试图解决以下问题从Scala不耐烦.问题如下:

使用模式匹配,编写一个函数交换,交换数组的前两个元素,前提是它的长度至少为2.

我的解决方案是:

def swap(sArr:Array[Int]) = sArr.splitAt(2) match { 
                               case (Array(x,y),Array(z)) => Array(y,x,z)
                               case (Array(x,y),Array()) => Array(y,x)
                               case _ => sArr
                            }
Run Code Online (Sandbox Code Playgroud)

我的问题是第一个案例陈述.我认为它会模式匹配,(Array(1,2),Array(3))而我打算模式匹配(Array(1,2),Array(3,4,5.....))

有人可以指出这是可能的.

谢谢

arrays scala pattern-matching

1
推荐指数
1
解决办法
1296
查看次数

C++调用程序中的所有update()函数

我知道这是可能的,但我对C++的经验不足限制了我.我想要做的是有一些系统,我可以添加update()方法到某些类,并在程序中的每个帧调用所有更新方法.

Unity3D用户可能对此很熟悉.但是,如果Update()在未确定的类中存在未确定数量的方法,程序如何知道调用每个方法.

我想这是一个在整个程序中动态调用函数的系统.

c++ methods

0
推荐指数
1
解决办法
7556
查看次数

为什么这段Scala代码无法编译?

它产生的错误是:

Funct.scala:5: 'val' expected but identifier found.
[error] class Funct[In,Out](function: In => Out, description: String, implicit m: Manifest[In => Out]) {
Run Code Online (Sandbox Code Playgroud)

并且有问题的代码是:

import scala.reflect.Manifest;

class Funct[In,Out](function: In => Out, description: String, implicit m: Manifest[In => Out]) {

  def isType[K](implicit man: Manifest[K]) = {
    m &lt;:&lt; man
  }

  def Apply(input: In): Out = {
    function.Apply(input)
  }

  def toString() = {
    description + m
  }
}
Run Code Online (Sandbox Code Playgroud)

我根本看不出问题所在.

scala

0
推荐指数
1
解决办法
148
查看次数