从我从Herb Sutter和其他人那里读到的内容,您会认为volatile并发编程是完全正交的概念,至少就C/C++而言.
但是,在GCC 实现中,所有std::atomic的成员函数都有volatile限定符.安东尼威廉姆斯的实施也是如此std::atomic.
那么什么是交易,我的atomic<>变量需要volatile与否?
当我尝试除以0时,下面的代码没有捕获异常.我是否需要抛出异常,或者计算机是否在运行时自动抛出一个异常?
int i = 0;
cin >> i; // what if someone enters zero?
try {
i = 5/i;
}
catch (std::logic_error e) {
cerr << e.what();
}
Run Code Online (Sandbox Code Playgroud) 我想测量我的C++代码的运行时.执行我的代码大约需要12个小时,我想在执行代码时写下这段时间.我怎么能在我的代码中做到这一点?
操作系统:Linux
错误出现在ShowMessage(aServer.mc_version)此代码的行中:
uses mantisconnect;
procedure TForm.Button1Click(Sender: TObject);
var
aServer: MantisConnectPortType;
begin
aServer := GetMantisConnectPortType;
ShowMessage('Mantis version:' + aServer.mc_version);
end;
Run Code Online (Sandbox Code Playgroud)
相同的代码适用于Delphi XE5,但是在Delphi XE6上编译时第一次触发错误(首次单击按钮),但下次有效:
The system cannot find the file specified
URL:http://www.mymantis.com/api/soap/mantisconnect.php -
SOAPAction: URL:http://www.mymantis.com/api/soap/mantisconnect.php/mc_version
Run Code Online (Sandbox Code Playgroud)
如果我再试一次(第二次点击按钮)就行了!输出:
Mantis version:1.2.9
Run Code Online (Sandbox Code Playgroud)
连接过程列表是
function GetMantisConnectPortType(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): MantisConnectPortType;
const
defWSDL = 'http://www.mymantis.com/api/soap/mantisconnect.php?wsdl';
defURL = 'http://www.mymantis.com/api/soap/mantisconnect.php';
defSvc = 'MantisConnect';
defPrt = 'MantisConnectPort';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr …Run Code Online (Sandbox Code Playgroud) 我修改了Boost Asio echo示例,用于async_read_until逐字读取输入.即使我正在使用async_read_until,所有发送的数据似乎都是从套接字中读取的.有人可以建议:
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
class session
{
public:
session(boost::asio::io_service& io_service)
: socket_(io_service)
{
}
tcp::socket& socket()
{
return socket_;
}
void start()
{
std::cout<<"starting"<<std::endl;
boost::asio::async_read_until(socket_, buffer, ' ',
boost::bind(&session::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_read(const boost::system::error_code& error,
size_t bytes_transferred)
{
std::ostringstream ss;
ss<<&buffer;
std::string s = ss.str();
std::cout<<s<<std::endl;
if (!error)
{
boost::asio::async_write(socket_,
boost::asio::buffer(s),
boost::bind(&session::handle_write, this,
boost::asio::placeholders::error));
}
else
{
delete this;
}
}
void handle_write(const boost::system::error_code& error) …Run Code Online (Sandbox Code Playgroud) 执行此浮点计算时boost::thread,它会产生与std::thread在主线程中或主线程中执行时不同的结果.
void print_number()
{
double a = 5.66;
double b = 0.0000001;
double c = 500.4444;
double d = 0.13423;
double v = std::sin(d) * std::exp(0.4 * a + b) / std::pow(c, 2.3);
printf("%llX\n%0.25f\n", *reinterpret_cast<unsigned long long*>(&v), v);
}
Run Code Online (Sandbox Code Playgroud)
这似乎是因为boost::thread默认情况下使用53位内部精度进行浮点数学运算,而主线程使用的是64位精度.如果在创建_fpreset()后重置FPU单元的状态boost::thread,则结果与主线程中的结果相同.
我正在使用Embarcadero C++ Builder 10.1(编译器bcc32c版本3.3.1)和Boost 1.55.0.我的环境是Windows 7,我正在构建32位Windows目标.
#include <tchar.h>
#include <thread>
#include <boost/thread.hpp>
#include <cstdio>
#include <cmath>
#include <cfloat>
namespace boost { void tss_cleanup_implemented() {} }
void print_number()
{
double …Run Code Online (Sandbox Code Playgroud) PSPS :( 一个预先编写脚本的脚本)
刚刚想到一个更有先见之明的问题包括以下概念:这是否为零值整数的非显示"0x"(showbase)是标准行为,或者这只是我的MinGW实施的一个怪癖?
这一切都是在一个愉快的星期天早上开始的......我想以十六进制表示形式转储一些Handles,并采用一致的格式化方式.
我想要一个前导0x和一个固定宽度,但事实证明这是使用预期的流操纵器难以捉摸的.
我发现这样做的唯一方法是将Handles强制转换为unsigned long.这似乎有点不合理,我希望我不是唯一一个想要这个的人......
我在标准六角形机械手中遗漏了什么?是因为类型void*(HANDLE)只是在ostream的正常十六进制处理之外定义?
总结:我不想将HANDLE强制转换为不是的东西.
我不想硬编码"0x"前缀.有没有办法使用标准操纵器?还是我需要重载ostream对HANDLE的处理?(但这可能使我超负荷!)
这是我的测试代码(及其输出).
我用过'.' 作为填充字符,为清楚起见,(我实际上将使用'0')
HANDLE h;
ULONG ul;
int iH = sizeof(h); // how many bytes to this void* type.
int iW = iH*2; // the max number of hex digits (width).
int iW2= iW+2; // the max number of hex digits (+ 2 for showbase "0x").
int iX = 4; // the number of bits per hex digit.
int …Run Code Online (Sandbox Code Playgroud) 我有一张包含一些数据的表格.它可以看起来像这样的例子:
7 Gelb
8 Schwarz
9 Weiß my color
10 Grau
16 Gelb I
17 Gelb II
18 Gelb III
19 Gelb IV
27 Schwarz I
28 Schwarz II
29 Schwarz III
30 Schwarz IV
31 Schwarz V
32 Schwarz VI
39 Weiß my color III
40 Weiß my color IV
41 Weiß my color V
42 Weiß my color VI
Run Code Online (Sandbox Code Playgroud)
如您所见,在某些记录中,我们在常规中使用罗马数字 <name><space><roman number>
例如,有"Gelb","Weiß我的颜色"和"Schwarz",在罗马会议中也有他们的记录.对于一些人来说,像"Grau",没有重复.
因此,将会有没有罗马数字的唯一颜色名称的记录,例如记录"Grau",并且在表格中它可以包含或不包含一些带有它的记录和罗马数字.
罗马数字总是在最后,如: <name><space><romannumber>
我的目标只是获得独特的名字.因此,我只想提取示例:
7 …Run Code Online (Sandbox Code Playgroud) 我对下一个代码有疑问:
int main {
double x = 0;
double y = 0/x;
if(y==1) {.....}
....
....
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在我的计算机上运行代码时,我没有遇到运行时错误,我看到了y = -nan(0x8000000000000).为什么不将运行时错误除以零?
此外,当我将第一行更改为int x = 0;
现在时,存在运行时错误.有什么不同?
可以检查x87浮点控制字的值_control87.当一个新线程启动时,在我的平台上,它似乎从父线程继承浮点控制字的值.
这是未定义的行为,还是我保证,如果我启动一个新线程,并且线程库没有错误,控制字具有与父线程中相同的值?
在哪个标准中定义了这种行为,以及如何?如果未在任何标准中定义,是在处理器手册或操作系统文档中定义的?
我正在使用C++语言,在64位Windows 7上开发,编译32位Windows目标,并使用x86兼容处理器执行代码.我需要专门针对此平台的答案,但如果所有语言和处理器的行为相同,那么通用答案会更好.
c++ ×7
c ×2
atomic ×1
boost ×1
boost-asio ×1
boost-thread ×1
c++11 ×1
c++builder ×1
delphi ×1
delphi-xe6 ×1
formatting ×1
linux ×1
manipulators ×1
mantis ×1
nan ×1
soap ×1
sql ×1
sql-server ×1
stream ×1
volatile ×1
x87 ×1