我正在使用Boost.Asio在C++中编写跨平台服务器程序.遵循此页面上的HTTP Server示例,我想在不使用特定于实现的API的情况下处理用户终止请求.我最初尝试使用标准C信号库,但一直无法找到适合Asio的设计模式.在Windows示例的设计似乎像最近的信号库,但有一个竞争条件,其中服务器对象已被破坏后控制台CTRL处理程序可以调用.我试图避免C++标准规定的未定义行为.
是否有标准(和正确)方法来停止服务器?
为了说明使用C信号库的问题:
#include <csignal>
#include <functional>
#include <boost/asio.hpp>
using std::signal;
using boost::asio::io_service;
namespace
{
std::function<void ()> sighandler;
}
extern "C"
{
static void handle_signal(int);
}
void handle_signal(int)
{
// error - undefined behavior
sighandler();
}
int main()
{
io_service s;
sighandler = std::bind(&io_service::stop, &s);
auto old_sigint = signal(SIGINT, &handle_signal);
if (old_sigint == SIG_IGN)
// race condition? raise SIGINT before I can set ignore back
signal(SIGINT, SIG_IGN);
auto old_sigterm = signal(SIGTERM, &handle_signal);
if …Run Code Online (Sandbox Code Playgroud) 这在许多地方都有描述,但我根本无法让它发挥作用.我从Cython调用C++函数:
cimport numpy as np
cdef extern from "test.h" namespace "mytest":
void test(double *A, int m)
cdef int foo():
cdef np.ndarray[double,mode="c"] a = np.array([1,2,3,4,5],dtype=float)
# pass ptr to first element of 'a'
test(&a[0], len(a))
return 0
foo()
Run Code Online (Sandbox Code Playgroud)
test.cpp只是:
#include <stdio.h>
namespace mytest {
void test(double *A, int m)
{
for (int i = 0; i < m; i++)
{
printf("%d is %f\n", i, A[i]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
test.h只有:
namespace mytest {
void test(double *A, int m);
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但何时np.ascontiguousarray需要?这样做是否足够: …
我正在尝试使用sqlite3 lib在c ++中创建数据库.我收到错误sqlite3_prepare_v2'
未在此范围内声明,如logcat中所示.
日志文件
..\src\Test.cpp: In function 'int main(int, const char**)':
..\src\Test.cpp:21:85: error: 'sqlite3_prepare_v2' was not declared in this scope
..\src\Test.cpp:30:13: error: variable 'sqlite3 in' has initializer but incomplete type
..\src\Test.cpp:30:30: error: invalid use of incomplete type 'sqlite3 {aka struct sqlite3}'
..\src\/sqlite3.h:73:16: error: forward declaration of 'sqlite3 {aka struct sqlite3}'
Run Code Online (Sandbox Code Playgroud)
这是我的代码
#include <iostream>
using namespace std;
#include "sqlite3.h"
int main (int argc, const char * argv[]) {
sqlite3 *db;
sqlite3_open("test.db", & db);
string createQuery = "CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码段:
#include <iostream>
using namespace std;
int a[10][2];
int b[10][2];
int main(){
//intended
cout << a[0][0] - b[0][0] << endl;
//left out dimension by mistake
cout << a[0] - b[0] << endl;
}
Run Code Online (Sandbox Code Playgroud)
显然(或者可能不是每个注释)第二种情况是C和C++中的有效指针算法,但在我使用它的代码库中通常是语义错误; 通常在嵌套的for循环中省略了维度.有没有-W标志或静态分析工具可以检测到这个?
我需要在我的linux系统上编译代码.这是简单的代码,我不知道什么是错的:
我有这个代码,我无法编译它:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string char1, char2, char3, char4, char5, char6;
cout<<"Hello this is your standard True and False quiz"<<endl;
cout<<"Please enter 'T' or 'F'"<<endl;
cout<<"No#1 George Washington invented the toilet?"<<endl;
cin>>char1;
if ( char1 != "T" || "F")
{
cout<<"You entered an incorrect character please reenter True of False"<<endl;
cin>>char1;
}
if ( char1 != "T" || "F")
{
cout<<"You entered an incorrect character please reenter True of False"<<endl;
cin>>char1;
} …Run Code Online (Sandbox Code Playgroud) 简而言之的问题是:如何释放从本机DLL返回的内存作为托管代码中的ItrPtr?
详细信息:假设我们有简单的函数将两个参数作为OUTPUT,第一个是参考指针到字节数组,第二个是参考Int.该函数将根据某些规则分配字节数,并返回内存指针和字节大小以及返回值(1表示成功,0表示失败).
下面的代码工作正常,我可以正确获取字节数组和字节数和返回值,但是当我尝试使用指针(IntPtr)释放内存时,我得到异常:
Windows已在TestCppDllCall.exe中触发了断点.
这可能是由于堆的损坏,这表明TestCppDllCall.exe或它已加载的任何DLL中的错误.
这也可能是由于用户在TestCppDllCall.exe具有焦点时按下F12.
输出窗口可能包含更多诊断信息.
为了清楚起见:
下一个C#代码与其他DLL函数正常工作具有相同的签名并释放内存工作没有任何问题.
如果您需要更改分配内存方法或添加任何其他代码,则接受(C)代码中的任何修改.
我需要的所有功能是Native DLL函数接受两个参数引用(Byte数组和int,在c#[IntPtr of byte array和int]中)根据一些规则填充一些值并返回函数结果(Success或Fail) .
CppDll.h
#ifdef CPPDLL_EXPORTS
#define CPPDLL_API __declspec(dllexport)
#else
#define CPPDLL_API __declspec(dllimport)
#endif
extern "C" CPPDLL_API int writeToBuffer(unsigned char *&myBuffer, int& mySize);
Run Code Online (Sandbox Code Playgroud)
CppDll.cpp
#include "stdafx.h"
#include "CppDll.h"
extern "C" CPPDLL_API int writeToBuffer(unsigned char*& myBuffer, int& mySize)
{
mySize = 26;
unsigned char* pTemp = new unsigned char[26];
for(int i = 0; i < 26; i++)
{
pTemp[i] = 65 + i;
}
myBuffer = pTemp;
return …Run Code Online (Sandbox Code Playgroud) 我需要将各种c/c ++进程固定到计算机上的特定核心,以便仅在Windows 7 64位上进行基准测试.我的机器有16个核心(2x8).我试图通过从给定进程的代码中调用SetProcessAffinityMask来做到这一点.假设这是正确的我不确定如何使用此功能.我已经看过文档,但我无法理解它对第二个参数需要的描述.我也没有在搜索过的SO或Google上找到任何c/c ++用例.
问题1:以16核机器(2cpux8)和ac/c ++项目为例,请您提供一个说明性示例,说明如何使用SetProcessAffinityMask来挑选16个核心中的每一个,以及对我理解的第二个参数的解释?如何将核心ID从0-15转换为等效的位掩码?
问题2:如果有2x8内核而不是一个cpu上的16个内核,它会对使用产生影响吗?或者是相同的用法?
非常感谢.这是我到目前为止所拥有的.
#include <Windows.h>
#include <iostream>
using namespace std;
int main () {
HANDLE process = GetCurrentProcess();
DWORD_PTR processAffinityMask = 0; /// What to do here?
BOOL success = SetProcessAffinityMask(process, processAffinityMask);
cout << success << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有这个代码.
#include <iostream>
int main()
{
unsigned long int i = 1U << 31;
std::cout << i << std::endl;
unsigned long int uwantsum = 1 << 31;
std::cout << uwantsum << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印出来.
2147483648
18446744071562067968
Run Code Online (Sandbox Code Playgroud)
在Arch Linux 64位,gcc,常春藤桥架构上.
第一个结果是有道理的,但我不明白第二个数字的来源.1表示为4byte int signed或unsigned is
00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)
当你向左移动31次时,你最终得到了
10000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
没有?我知道向左移动正数基本上是2 ^ k,其中k是你移动它的次数,假设它仍然适合于界限.为什么我得到这么奇怪的数字?
考虑一个基于两个步骤的MPI应用程序,我们称之为load和globalReduce.为了简单起见,软件正在被描述,但还有很多事情要发生,所以它不仅仅是一个Map/Reduce问题.
在加载步骤期间,每个给定节点中的所有排队都排队,以便只有一个排名对该节点的所有内存具有完全访问权限.这种设计的原因在于,在加载阶段,有一组大的IO块被读取,并且它们都需要在可以进行局部缩减之前加载到存储器中.我们将这个局部缩减的结果称为命名变量myRankVector.一旦myRankVector 获得变量,则IO块被释放.变量myRankVector本身使用的内存很少,因此在创建过程中节点可以使用所有内存,完成后排名只需要使用2-3 GB来保存myRankVector.
在节点的globalReduce阶段,预计节点中的所有等级都加载了相应的globalReduce.
所以这是我的问题,虽然我已经确保绝对没有任何内存泄漏(我使用共享指针编程,我用Valgrind进行了双重检查等),我很肯定即使在所有析构函数发布之后堆也会保持扩展IO块.当队列中的下一个排名来完成它的工作时,它开始要求大量内存,就像之前的排名一样,当然程序得到Linux杀死产生"Out of memory:Kill process xxx(xxxxxxxx)得分xxxx或者牺牲孩子".很清楚为什么会出现这种情况,队列中的第二个等级想要使用所有内存,但第一个等级仍然是大堆.
因此,在设置此问题的上下文之后:有没有办法手动减少C++中的堆大小以真正释放未使用的内存?
谢谢.
我在Windows 7 64bit上安装了Microsoft Visual Studio 2010.(在项目属性中,"字符集"设置为"未设置",但每个设置都会导致相同的输出.)
源代码:
using namespace std;
char const charTest[] = "árvízt?r? tükörfúrógép ÁRVÍZT?R? TÜKÖRFÚRÓGÉP\n";
cout << charTest;
printf(charTest);
if(set_codepage()) // SetConsoleOutputCP(CP_UTF8); // *1
cerr << "DEBUG: set_codepage(): OK" << endl;
else
cerr << "DEBUG: set_codepage(): FAIL" << endl;
cout << charTest;
printf(charTest);
Run Code Online (Sandbox Code Playgroud)
*1:包括windows.h弄乱东西,所以我从一个单独的cpp中包含它.
已编译的二进制文件包含字符串作为正确的UTF-8字节序列.如果我将控制台设置为带有chcp 65001和发出的UTF-8 type main.cpp,则字符串会正确显示.
测试(控制台设置为使用Lucida Console字体):
D:\dev\user\geometry\Debug>chcp
Active code page: 852
D:\dev\user\geometry\Debug>listProcessing.exe
?írv??zt??r?? t??k?Ârf??r??g??p ?üRV??ZT??R?É T??K??RF?ÜR?ôG?ëP
?írv??zt??r?? t??k?Ârf??r??g??p ?üRV??ZT??R?É T??K??RF?ÜR?ôG?ëP
DEBUG: set_codepage(): OK
??rv??zt??r?? t??k??rf??r??g??p ??RV??ZT??R?? T??K??RF??R??G??P
árvízt?r? …Run Code Online (Sandbox Code Playgroud)