小编ixS*_*Sci的帖子

LD_LIBRARY_PATH优先级

我偶然发现了一些奇怪的行为:在我启动应用程序之前,我已将LD_LIBRARY_PATH设置为包含所有所需库的本地lib目录.启动后,我有部分(大部分)libs从LD_LIBRARY_PATH加载,但有一些是从标准/ usr/lib加载的(例如/usr/lib/libQtNetwork.so.4,/usr/lib/libSM.so. 6).所有这些库都包含在LD_LIBRARY_PATH中列出的目录中.任何人都可以解释为什么我有这样的行为?我对Linux世界不是很熟悉,但是本文说我的方法应该有效

PS如果我将/ usr/libs重命名为其他东西,我将使用从我的libs位置使用的所有lib运行我的应用程序

预先感谢!

linux operator-precedence dynamic-library

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

Task.Run()和await Task.Run()有什么区别?

以下程序使用通用Task.Run()并使用async和await(异步)设计.在这两种情况下,从线程池中获取不同的线程以用于新任务.那么区别是什么呢?异步意味着它应该使用主线程并释放它直到任务完成.但它也使用另一个线程而不是使用主线程.

public class Worker2
{
    public bool IsComplete { get; private set; }
    internal void DoWork()
    {
        this.IsComplete = false;
        Console.WriteLine("Doing Work.");
        Task.Run(new Action(LongOperation));
        Console.WriteLine("Work Completed");
        IsComplete = true;
    }

    private void LongOperation()
    {
            Console.WriteLine("long operation thread thread :" + Thread.CurrentThread.ManagedThreadId);//Thread Id = 7. it is different from main thread id.
            Console.WriteLine("Working!");
            Thread.Sleep(3000);
    }
}
Run Code Online (Sandbox Code Playgroud)

//和异步

public class Worker2
{
    public bool IsComplete { get; private set; }
    internal async void DoWork()
    {
        this.IsComplete = false;
        Console.WriteLine("Doing Work.");       
        await LongOperation(); …
Run Code Online (Sandbox Code Playgroud)

c# multithreading asynchronous

5
推荐指数
2
解决办法
2932
查看次数

读消除和并发

给出以下简单代码:

class Program
{
    static bool finish = false;

    static void Main(string[] args)
    {
        new Thread(ThreadProc).Start();
        int x = 0;
        while (!finish)
        {
            x++;
        }
    }

    static void ThreadProc()
    {
        Thread.Sleep(1000);
        finish = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用MSVS2015(.NET 4.6)在发布模式下运行它,我们将得到一个永无止境的应用程序.这是因为JIT编译器生成的代码finish只读取一次,因此忽略了任何未来的更新.

问题是:为什么允许JIT编译器进行这样的优化?规范的哪一部分允许它?

c#

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

使用声明作为覆盖

我们在标准中有以下简单(并稍加修改以添加main和输出)示例:

struct A {
    virtual void f()
    {
        cout << "A\n";
    }
};

struct B : virtual A {
    virtual void f()
    {
        cout << "B\n";
    }
};

struct C : B, virtual A {
    using A::f;
};

int main()
{
    C c;
    c.f();              // calls B?::?f, the final overrider
    c.C::f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

从中我们可以得出一个using A::f不存在重写的结论.但标准中的措辞是什么意思呢?以下是C++ 17草案([class.virtual] p2)中最终覆盖的措辞:

<...>类对象S的虚拟成员函数C :: vf是最终覆盖,除非其中S是基类子对象(如果有)的最派生类(4.5)声明或继承覆盖的另一个成员函数vf.在派生类,如果一个基类子对象的虚拟成员函数具有一个以上的最终超控器程序是非法的构造.

我无法找到"覆盖"实际意味着什么.如果没有定义并且我们将任何声明视为重载,那么我们应该将using声明视为重载,因为[namespace.udecl] p2说:

每个using声明都是声明和成员声明,​​因此可以在类定义中使用.

我理解标准使用声明的意图是不引入覆盖,但有人能指出我在Standardese中的实际引用吗?这是第一部分,现在是第二部分


请考虑以下代码:

#include <iostream>
#include <string>

using std::cout;

class A …
Run Code Online (Sandbox Code Playgroud)

c++ overriding multiple-inheritance using-declaration language-lawyer

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

重载决策中的约束是否受到不同类型限定符的影响?

有以下简单代码:

#include <concepts>

auto f(const auto&) { }
auto f(std::integral auto) {}

int main() 
{ 
    f(5); 
}
Run Code Online (Sandbox Code Playgroud)

我们对 clang 和 gcc 的调用不明确,但 MSVC 选择了更受约束的调用。到目前为止,我没有发现任何可以支持 clang 和 gcc 行为的内容。那么这是两个编译器中的错误还是有什么东西使这个调用不明确?

c++ c++-concepts c++20

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

std :: call_once和内存重新排序

鉴于此处的代码:

class lazy_init
{
    mutable std::once_flag flag;
    mutable std::unique_ptr<expensive_data> data;

    void do_init() const
    {
        data.reset(new expensive_data);
    }
public:
    expensive_data const& get_data() const
    {
        std::call_once(flag,&lazy_init::do_init,this);
        return *data;
    }
};
Run Code Online (Sandbox Code Playgroud)

我在其他地方也看到了相同模式的一些变体.所以我的问题是:为什么这段代码被认为是保存?为什么编译器在调用std :: call_once之前不能只读取数据并最终得到不正确的数据?例如

tmp = data.get();
std::call_once(flag,&lazy_init::do_init,this);
return *tmp;
Run Code Online (Sandbox Code Playgroud)

我的意思是我没有找到任何可以阻止这种情况的障碍.

c++ memory-fences c++11

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

Lambda 捕获列表和复制

我有一个简单的代码:

#include <iostream>
#include <functional>

struct Copy
{
    Copy(){}
    Copy(const Copy&)
    {
        std::cout << "Copied!\n";
    }
};

int main() 
{
    Copy copy;
    std::function<void()> func = [=]{(void)copy;};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它调用 copy-ctor 2 次,而我只想拥有它一次。我知道我可以在这个简化的例子中使用 auto 但我需要存储它以供以后使用,所以 auto 是没有选择的。我的问题是:有没有办法用=捕获列表存储 lambda并且只有一个捕获对象的副本?

c++ lambda c++11

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

带有包含图像的自述文件的Mac OS安装程序包

我正在尝试<readme>在包的Distribution.xml部分设置标记以包含可能包含图像的内容.现在我试过rtfdpdf ; 对于rtfd,它表示由于权限不足而无法打开文件,并且pdf显示为纯文本.所以问题是:如何使用Distribution.xml包含可能包含图像的内容

macos productbuild

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

AppleScript和不可编写脚本的应用程序

我想知道如何编写没有字典的应用程序脚本.我发现的所有信息都没有告诉我什么.但我的经验告诉我,有一种方法.例如:

tell application "Firefox"
    return count of windows
end tell
Run Code Online (Sandbox Code Playgroud)

将工作.它将与"Opera"和其他没有字典的应用程序一起使用.所以问题是:1)为什么它有效?2)还有什么方法可以这样做?是否有所有此类行为的清单?

预先感谢!

applescript

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

在启动之前为进程设置环境变量

我有以下情况:

我的Mac OS捆绑了应用程序,该应用程序使用了一些第三方动态库,而这些库依赖于某些环境变量,因此命名它ENV_VAR。我只想ENV_VAR为我的应用程序设置一些值,因为如果为整个系统设置它,可能会破坏其他一些应用程序。而且它应该对用户透明,即他只需双击Application文件夹中的应用程序即可运行我的应用程序。我该如何实现?

注意:动态库会在主要功能启动之前加载,因此在主要功能中设置此变量无济于事。

macos bash shell applescript

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