小编Sel*_*_va的帖子

开销 - 从C#调用C++函数

我从C#调用两个C++函数.虽然在大约100万次调用的迭代中这样做,但我看到了大约30%的开销.

C++函数:

EXTERN_C void STDAPICALLTYPE FunctionA(UINT_PTR mathId)
{
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

在我的C#程序集中,dll为:

[DllImport("CPlusPlus.dll")]
    public static extern void FunctionA([In] IntPtr mathID);
Run Code Online (Sandbox Code Playgroud)

从以下功能调用:

 public static void HelpingFunction([In]UInt64 mathID)
    {
        FunctionA((IntPtr)mathID);
    }
Run Code Online (Sandbox Code Playgroud)

当"HelpingFunction"被调用超过一百万次时,这种实现方式会产生更多的开销.

有人可以给我其他想法,以便减少开销吗?从C#程序集调用C++函数的其他方法有哪些?

c# c++ pinvoke marshalling

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

.NET 检测 - 对自定义程序集的函数调用失败 - Azure Web 应用

我已经通过 Visual Studio 2012 将我的 .NET 检测分析器部署到 Azure webapps 中。我的分析器执行字节码检测,如下所示,

FunctionA()
{
   --> Injected C# function Call 
   functionA's body
   -->Injected C# function Call
}
Run Code Online (Sandbox Code Playgroud)

注入的函数调用驻留在单独的程序集 dll 上。在物理框中,程序集将添加到 GAC 中。但在 Azure 中,它将出现在 web 应用程序位置的文件夹中,该文件夹将在 web.config 文件中进行探测。

使用 IMetaDataAssemblyEmit 的 DefineAssemblyRef,我定义了程序集及其在加载到进程中的每个模块中的功能。该问题是注入的函数调用仅适用于Web应用程序模块的功能..!System.Web.dll 或 System.Data.dll 等其他模块无法调用该函数,这导致 Azure Web 应用程序无法加载并出现 502 错误。

很快,注入到 Web 应用程序以外的模块中就失败了。我猜这是加载自定义程序集时的安全问题,我也尝试设置[assembly: System.Security.AllowPartiallyTrustedCallers]PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]其他一些安全属性.. 没有帮助.. 如何使这个帮助程序集由 .Net 模块加载。?我是否需要为程序集设置任何其他特定的安全属性才能加载..?

profiler azure .net-assembly azure-web-app-service clr-profiling-api

5
推荐指数
0
解决办法
121
查看次数

C ++ Map并发插入和两个线程读取

有两个线程,一个将插入地图,另一个将从地图插入find

map<string,object>* mapA;
Run Code Online (Sandbox Code Playgroud)

如果线程A将配置对象插入带字符串键的Map中。

线程B将尝试查找具有相同字符串键的位置。如果不存在,它将重试直到找到它的字符串。

如果在读取线程B的同时插入线程A,会在进程中导致崩溃或数据损坏吗?这里需要同步吗?

在使用示例应用程序进行测试时,我面临任何类型的崩溃或损坏

c++ multithreading synchronization dictionary

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

进程之间的并发文件写入

我需要将日志数据写入来自不同进程的单个文件中.

我正在使用Windows Mutex,它需要Common Language Runtime支持.

Mutex^ m = gcnew Mutex( false,"MyMutex" );
m->WaitOne();
//... File Open and Write ..
m->ReleaseMutex()
Run Code Online (Sandbox Code Playgroud)

我真的需要从C++更改为C++/CLI进行同步吗?

如果不使用原子就可以了.但我需要知道,与本地互斥锁相比,使用此互斥锁是否会降低性能.

.net c++ synchronization mutex c++-cli

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

共享向量与原子布尔同步

我有一个共享向量,可通过两个线程访问。

线程A的函数推入向量,线程B的函数将向量完全交换以进行处理。

    MovetoVec(PInfo* pInfo)
    {
       while(1)
        {
            if(GetSwitch())
            {
                swapBucket->push_back(pInfo);
                toggles = true;
                break;
            }
            else if(pInfo->tryMove == 5)
            {
                delete pInfo;
                break;
            }
            pInfo->tryMove++;
            Sleep(25);
        }
    }
Run Code Online (Sandbox Code Playgroud)

线程A试图使原子布尔值toggles变为true并推入向量。(上面的MoveToVec函数将被许多线程调用)。函数GetSwitch定义为

GetSwitch()
{
   if(toggles)
   {
      toggles = false;
      return TRUE;
   }
   else
        return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

toggles 这是atomic_bool,线程B中另一个交换向量的函数是

    GetClassObj(vector<ProfiledInfo*>* toSwaps)
    {
        if(GetSwitch())
        {
            toSwaps->swap(*swapBucket);
            toggles = true;
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果GetSwitch返回false,则threadB不执行任何操作。在这里我不使用任何锁定。它在大多数情况下都有效。但是有时pInfo,swapBucket 中的对象之一为NULL。我知道这是因为同步不良。

我遵循这种类型的GetSwitch()逻辑只是为了忽略由锁定引起的开销。我应该放弃这个并返回互斥或关键部分的东西吗?

c++ multithreading mutex vector thread-safety

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