当我正在探索NodeJS应用程序和Java应用程序如何处理请求时,我遇到了Servlet对请求的异步处理.
从我在不同的地方阅读:
请求将由来自Servlet容器的HTTP线程接收和处理,并且在阻塞操作(如I/O)的情况下,请求可以移交给另一个Threadpool,并且接收请求的HTTP线程可以返回接收并处理下一个请求.
现在,来自Threadpool的工作人员将占用耗时的阻塞操作.
如果我理解的是正确的,我有以下问题:
即使是处理阻塞操作的线程也会等待该操作完成,从而阻塞资源(并且处理的线程数等于内核数),如果我是对的话.
通过使用异步处理,这里获得了什么?
如果没有,请赐教.
我正准备实现我自己的类,以便从数组中有效删除,但我想我会问,看看它是否已经存在.我想要的是类似列表的访问效率,但使用数组.我想使用数组是出于缓存一致性的原因,所以我不必一直调用内存分配器(因为在分配节点时使用std :: list).
我想做的是创建一个包含两个数组的类.第一个是一组元素,第二个数组是一组整数,其中每个整数是第一个数组中的空闲槽.因此,我可以非常轻松地从数组中添加/删除元素,而无需为它们分配新内存,只需从空闲列表中获取索引并将其用于新元素即可.
有这样的事情吗?如果我自己做,我还必须自己创建迭代器,所以你可以迭代这个集合,避免数组中的任何空槽,我不太喜欢它.
谢谢.
注意:我想在集合上执行的操作类型是:
所述不存在的数据争用为前提顺序一致性.数据争用是由冲突的访问引起的.如果至少有一个访问是写,则对同一变量的两次访问是冲突的.
请参阅JLS7的以下引用以供参考.
我理解这种情况的定义,其中一个操作是读访问,另一个操作是写访问.但是,我不明白为什么需要(对于内存模型),如果对同一个变量有两个写操作.
问题:在对同一个变量进行两次写入操作的情况下,不保证顺序一致性的理由是什么,这些操作不是由先发生关系排序的?
§17.4.1:[..] 如果至少有一个访问是写入,则对同一变量的两次访问(读取或写入)被认为是冲突的.
§17.4.5:[..]当一个程序包含两个冲突的访问时,这些访问不是由一个先发生的关系排序的,它被认为包含一个数据竞争.[..] 当且仅当所有顺序一致的执行没有数据争用时,程序才能正确同步.如果程序正确同步,则程序的所有执行将看起来是顺序一致的.
我目前正在阅读O'reilly Java 8 Lambdas是一本非常好的书.我遇到过这样的例子.
我有一个
private final BiFunction<StringBuilder,String,StringBuilder>accumulator=
(builder,name)->{if(builder.length()>0)builder.append(",");builder.append("Mister:").append(name);return builder;};
final Stream<String>stringStream = Stream.of("John Lennon","Paul Mccartney"
,"George Harrison","Ringo Starr");
final StringBuilder reduce = stringStream
.filter(a->a!=null)
.reduce(new StringBuilder(),accumulator,(left,right)->left.append(right));
System.out.println(reduce);
System.out.println(reduce.length());
Run Code Online (Sandbox Code Playgroud)
这产生了正确的输出.
Mister:John Lennon,Mister:Paul Mccartney,Mister:George Harrison,Mister:Ringo Starr
我的问题被认为是reduce最后一个参数的方法BinaryOperator
我的问题是这个参数用于哪个?如果我改变
.reduce(new StringBuilder(),accumulator,(left,right)->new StringBuilder());
Run Code Online (Sandbox Code Playgroud)
如果我通过,NULL那么输出是相同的,然后返回NPE.
这个参数用于什么?
UPDATE
为什么如果我运行它parallelStream我收到不同的结果?
第一次运行.
returned StringBuilder length = 420
Run Code Online (Sandbox Code Playgroud)
第二轮
returned StringBuilder length = 546
Run Code Online (Sandbox Code Playgroud)
第三次运行
returned StringBuilder length = 348
Run Code Online (Sandbox Code Playgroud)
等等?为什么这个...不应该在每次迭代时返回所有值?
任何帮助都非常感激.
谢谢.
Clang 3.2在以下代码中报告错误,我不明白为什么会出现问题.该错误仅在模板函数中发生,并且仅在使用大括号进行初始化时才会发生.其他两个初始化按预期工作.
struct foo {
foo() { }
~foo() = default;
// deleted
foo(const foo& rhs) = delete;
foo(foo&& rhs) noexcept = delete;
auto operator=(const foo& rhs) -> foo& = delete;
auto operator=(foo&& rhs) noexcept -> foo& = delete;
};
template <typename Type>
void bar() {
foo a; // OK
foo b{}; // ERROR
}
int main() {
foo c{}; // OK
bar<int>();
}
Run Code Online (Sandbox Code Playgroud)
如果我编译代码clang++ -Wall -std=c++11 -c,Clang打印以下错误消息:
bug.cpp:14:9: error: conversion function from 'foo' to 'foo' invokes a …Run Code Online (Sandbox Code Playgroud) 该标志O_DIRECTORY可以与系统调用中使用open(2)和openat(2)打开的目录时避免拒绝服务漏洞.但是:如何避免常规文件的相同竞争条件?
一些背景信息:我正在尝试开发某种备份工具.程序遍历目录树,读取所有常规文件,只读取其他文件的统计信息.如果我首先调用fstatat(2)每个目录条目,测试常规文件的结果并打开它们openat(2),那么系统调用之间就存在竞争条件.攻击者可以使用FIFO替换常规文件,我的程序将挂起FIFO.
我怎样才能避免这种竞争条件?对于目录,可以使用O_DIRECTORY符号链接O_PATH.但是,我找不到常规文件的解决方案.我只需要一个适用于最新Linux版本的解决方案.
我正在尝试编写一个宏来从常规字符串文字中创建用户定义的文字.以下两行应该创建令牌"foobar"_literal:
#define AS_LITERAL(TEXT) TEXT ## _literal
AS_LITERAL("foobar");
Run Code Online (Sandbox Code Playgroud)
但是,GCC-4.7的预处理器报告以下错误:
error: pasting ""foobar"" and "_literal" does not give a valid preprocessing token
Run Code Online (Sandbox Code Playgroud)
如何正确地做到这一点?
我想等待一段时间的条件.我读了升压文件和它似乎是最好使用功能wait_for与谓词,如所描述这里.
不幸的是,这个例子对我来说并不是很有用.我该如何编写谓词?我试着编写上面报告的代码但是visual studio编译器抱怨:c:\boost\boost\thread\win32\condition_variable.hpp(394): error C2064: term does not evaluate to a function taking 0 arguments
这是代码的一部分:
class MyClass{
boost::mutex mutex;
boost::condition_variable myCondition;
//...
void foo();
bool myPredicate();
}
void MyClass::foo(){
boost::unique_lock<boost::mutex> lock(mutex);
boost::chrono::microseconds period(25000);
// ...
boost::chrono::system_clock::time_point wakeUpTime = boost::chrono::system_clock::now() + period;
if(myCondition.wait_until(lock,wakeUpTime,MyClass::myPredicate) == true){/...}
}
bool MyClass::myPredicate(){
if(...)
return true;
else
return true;
}
Run Code Online (Sandbox Code Playgroud)
使用wait_for谓词的正确方法是什么?
我想在Java 8中使用聚合操作找到几个矩形的平均面积.
Rectangle[] rects = new Rectangle[]{
new Rectangle(5, 10, 20, 30),
new Rectangle(10, 20, 30, 40),
new Rectangle(20, 30, 5, 15)
};
System.out.println("Average area: "
+ Arrays.asList(rects)
.parallelStream()
.map((RectangularShape r) -> (r.getWidth() * r.getHeight()))
.collect(Collectors.averagingDouble(o -> o)));
// I don't like this "o -> o"
System.out.println("Expected: 625");
Run Code Online (Sandbox Code Playgroud)
但是,我找到了一种愚蠢的o -> o要求averagingDouble.是否有更直观的替代这个lambda(甚至可能是某个地方的股票身份lambda)?
Andrew Koenig撰写了一篇文章,题为" 一些优化比其他人更重要",其中包含以下两个函数定义:
string rev(string s) {
reverse(s.begin(), s.end());
return s; // GCC-4.8 uses move constructor
}
string rev(string&& s) {
reverse(s.begin(), s.end());
return s; // GCC-4.8 uses copy constructor
}
Run Code Online (Sandbox Code Playgroud)
文章暗示第二个函数(与const string&重载相结合)比第一个函数更有效.然而,当我用GCC-4.8进行测试时,这不是我所看到的.第一个函数在语句中移动对象s,return而第二个函数复制对象.如果我将第二个函数中的return语句更改为return move(s);,则在两种情况下都将移动该对象.
问题:可以在语句中自动移动哪些参数return?更具体地说,声明为非const rvalue-references的参数是否可以自动移动?
c++ ×5
java ×4
c++11 ×3
java-8 ×2
arrays ×1
asynchronous ×1
boost ×1
boost-thread ×1
c ×1
clang ×1
filesystems ×1
lambda ×1
linux ×1
literals ×1
servlets ×1