小编Kim*_*man的帖子

我的自旋锁实现是否正确且最佳?

我正在使用旋转锁来保护非常小的关键部分.争用情况非常罕见所以自旋锁是比常规的互斥体更合适.

我目前的代码如下,并假设x86和GCC:

volatile int exclusion = 0;

void lock() {
    while (__sync_lock_test_and_set(&exclusion, 1)) {
        // Do nothing. This GCC builtin instruction
        // ensures memory barrier.
    }
}

void unlock() {
    __sync_synchronize(); // Memory barrier.
    exclusion = 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道:

  • 这段代码是否正确?它是否正确地确保互斥?
  • 它适用于所有x86操作系统吗?
  • 它也适用于x86_64吗?在所有操作系统上?
  • 它是最佳的吗?
    • 我已经看到使用比较和交换的自旋锁实现,但我不确定哪个更好.
    • 根据GCC原子内置文档(http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html),还有__sync_lock_release.我不是记忆障碍的专家,所以我不确定我是否可以使用它而不是__sync_synchronize.
    • 我正在针对没有争用的情况进行优化.

我不在乎在所有有关争.有可能是1,也许2其他线程试图每过一次锁自旋锁.

c concurrency multithreading mutual-exclusion spinlock

37
推荐指数
2
解决办法
4万
查看次数

TextBox C#中的Max Char?

只是想知道C#Textbox多线可以容纳多少个字符?

textbox char winforms

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

用于选择连接到一个顶点的所有边和顶点的算法

我正在使用Boost Graph来尝试理解我在Graphviz Dot格式中生成的一些依赖图.

不幸的是,我对图理论知之甚少,所以我很难用图理论术语来构建我想知道的东西.

从具有〜150个顶点的有向依赖图中,我想在一个特定的顶点V上"放大",并构建一个包含V的子图,其所有传入边和它们的传入边,它的所有传出边和它们的传出边,有点像通过V的最长路径.

这些依赖图非常混乱,所以我想删除混乱,以便更清楚可能影响所讨论的顶点的内容.

例如,给定;

     g
     |
     v
a -> b -> c -> d
|    |         |
v    v         |
e    f <-------+
Run Code Online (Sandbox Code Playgroud)

如果我要运行算法c,我想我想要;

     g
     |
     v
a -> b -> c -> d -> f
Run Code Online (Sandbox Code Playgroud)

不确定是否应该包括b - > f ...我认为它是因为所有顶点"之前"c应该包含它们的边缘,并且所有顶点"之后"c应该包括它们的外边缘,但是在我看来,这会失去一些信息.

感觉应该有一个算法来做到这一点(或者更明智的东西,不确定我是否想要做一些愚蠢的事情,参见上面的b-> f),但我不知道从哪里开始寻找.

谢谢!

c++ boost graph

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

如何使用win32 API使用VC++创建椭圆形窗口

我正在使用VC++通过win32 API创建一个窗口程序.我想创建一个椭圆形窗口,如何实现这一目标.

winapi visual-c++

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

获取静态字段的值

我有以下课程:

public static class Pages
{
    public static string LoggedOut = "LoggedOut.aspx";
    public static string Login = "Login.aspx";
    public static string Home = "Home.aspx";
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以Pages.Home静态使用,但我的问题有一个原因.

我希望有一个方法,我可以像这样调用:

string pageName = Pages.GetPage("Home");
Run Code Online (Sandbox Code Playgroud)

等等

C'est可能吗?

谢谢,戴夫

.net c# reflection static-members

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

-fno-omit-frame-pointer没有优化

我想知道-fno-omit-frame-pointer在没有优化的情况下会做什么?

CXXFLAGS = -Wall -ggdb3 -DDEBUG -fno-omit-frame-pointer

是不是fomit-frame-pointer在-O(-O0除外)的所有级别都自动打开?我假设在我的例子中默认为-O0.

感谢致敬!

c++ optimization pointers frame

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

正确地将活动传递给非活动对象

在我的应用程序中,我有一个非活动对象,它的角色是经理类.很多时候我需要将"源活动"传递给方法作为该管理器类的参数,以便对该活动进行一些操作.

例如,让我们假设我们有MyActivity,它必须做一些吐司.所以我有这个名为MyManager的经理类,我有这个方法

raiseToast(Activity sourceActivity) {

  Toast.makeText(sourceActivity, demo, Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)

从Myactivity类我们以这种方式调用该方法:

MyManager manager=new MyManager();
manager.raiseToast(MyActivity.this);
Run Code Online (Sandbox Code Playgroud)

它工作正常.

我在这里问的是,这是将Activity作为参数传递给非活动对象的正确方法吗?我在真实设备(而不是模拟器)上有内存泄漏,我想知道这是否也会导致任何原因?

谢谢Idan.

android android-emulator

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

DoEvents等效于C++?

我是原生c ++的新手.现在,我按下了鼠标左键,它有一个执行InvalidateRect的for循环并绘制一个矩形,并在每次迭代时按照框大小递增X. 但是,C++在绘制方面比C#更快更有效率,它可以立即绘制所有这些内容.我想要的是它使矩形无效,显示矩形,等待50ms,然后继续循环.我试过睡眠(50),但它仍然等到绘画完成后再显示结果.我也尝试过PeekMessage,但它没有改变任何东西.任何帮助,将不胜感激.谢谢

c++ windows winapi

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

案例折叠UTF-8不知道语言

我正在尝试评估不区分大小写的UTF-8字符串比较的不同策略.

我已经阅读了Unicode联盟的一些材料,尝试了ICU,并尝试提出各种实施质量的替代方案.

我曾多次看到简单案例映射和完整案例映射之间的文本不同,我想确保完全理解差异.

在我阅读它时,简单案例映射是"无上下文",即不需要知道有效载荷是什么语言.由于突厥语"I /ı/İ/ i"崩溃,这将给出近似结果.

另一方面,完整案例映射需要知道有效载荷的语言才能执行映射.有了这些额外的信息,它可以采取特殊措施来涵盖"Kim"作为突厥语字符串应该在大写字母中成为"KİM",而"Kim"作为英语字符串,在大写字母中应该变成"KIM"的情况.

我做对了吗?

是否存在针对不同语言折叠不同的"多面"代码点的其他示例?

谢谢!

更新:其中一个提到简单案例映射作为语言独立的来源是ICU的文档.我把它解释为Unicode真理,但也许它只是一个实现的声明?

c utf-8 case-insensitive

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

在.NET 4.0中,Exception.ToString被破坏了吗?

我正在使用一个使用Exception.ToString()报告异常的测试框架.

我昨天遇到了嵌套异常的不完整报告,并且在使用Reflector进行一些工作后得出结论,.NET 4.0已经打破了内部异常字符串表示的组成方式.

这是一个例子;

public class MyException : Exception
{
  DateTime when;

  public MyException(DateTime when)
  {
    this.when = when;
  }

  public override string ToString()
  {
    var builder = new StringBuilder();
    builder.AppendFormat("Happened at: {0}\r\n", this.when);
    builder.Append(base.ToString());
    return builder.ToString();
  }
}

class Program
{
  private static void throws()
  {
    throw new Exception("bobby!", new MyException(DateTime.Now));
  }

  private static void catches()
  {
    try
    {
      throws();
    }
    catch (Exception e)
    {
      Console.WriteLine(e);
    }
  }

  static void Main(string[] args)
  {
    catches();
  }
}
Run Code Online (Sandbox Code Playgroud)

此处的控制台输出包含我的自定义"Happened …

.net exception

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