小编nos*_*sid的帖子

Servlet异步处理请求

当我正在探索NodeJS应用程序和Java应用程序如何处理请求时,我遇到了Servlet对请求的异步处理.

从我在不同的地方阅读:

请求将由来自Servlet容器的HTTP线程接收和处理,并且在阻塞操作(如I/O)的情况下,请求可以移交给另一个Threadpool,并且接收请求的HTTP线程可以返回接收并处理下一个请求.

现在,来自Threadpool的工作人员将占用耗时的阻塞操作.

如果我理解的是正确的,我有以下问题:

即使是处理阻塞操作的线程也会等待该操作完成,从而阻塞资源(并且处理的线程数等于内核数),如果我是对的话.

通过使用异步处理,这里获得了什么?

如果没有,请赐教.

java multithreading asynchronous servlets

6
推荐指数
2
解决办法
1732
查看次数

索引集(用于向量中的有效删除)

我正准备实现我自己的类,以便从数组中有效删除,但我想我会问,看看它是否已经存在.我想要的是类似列表的访问效率,但使用数组.我想使用数组是出于缓存一致性的原因,所以我不必一直调用内存分配器(因为在分配节点时使用std :: list).

我想做的是创建一个包含两个数组的类.第一个是一组元素,第二个数组是一组整数,其中每个整数是第一个数组中的空闲槽.因此,我可以非常轻松地从数组中添加/删除元素,而无需为它们分配新内存,只需从空闲列表中获取索引并将其用于新元素即可.

有这样的事情吗?如果我自己做,我还必须自己创建迭代器,所以你可以迭代这个集合,避免数组中的任何空槽,我不太喜欢它.

谢谢.

注意:我想在集合上执行的操作类型是:

  1. 迭代
  2. 通过索引随机访问单个元素(或者我正在考虑的"句柄")
  3. 删除集合中任何位置的元素
  4. 在集合中添加元素(顺序不重要)

c++ arrays

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

为什么在Java内存模型中对同一个变量的两次写入冲突?

所述不存在数据争用为前提顺序一致性.数据争用是由冲突的访问引起的.如果至少有一个访问是写,则对同一变量的两次访问是冲突的.

请参阅JLS7的以下引用以供参考.

我理解这种情况的定义,其中一个操作是读访问,另一个操作是写访问.但是,我不明白为什么需要(对于内存模型),如果对同一个变量有两个写操作.

问题:在对同一个变量进行两次写入操作的情况下,保证顺序一致性的理由是什么,这些操作不是由先发生关系排序的?


§17.4.1:[..] 如果至少有一个访问是写入,则对同一变量的两次访问(读取或写入)被认为是冲突的.

§17.4.5:[..]当一个程序包含两个冲突的访问时,这些访问不是由一个先发生的关系排序的,它被认为包含一个数据竞争.[..] 当且仅当所有顺序一致的执行没有数据争用时,程序才能正确同步.如果程序正确同步,则程序的所有执行将看起来是顺序一致的.

java multithreading

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

Java 8减少BinaryOperator用于什么?

我目前正在阅读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)

等等?为什么这个...不应该在每次迭代时返回所有值?

任何帮助都非常感激.

谢谢.

java binary-operators java-8

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

在常规初始化中意外转换

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)

c++ clang c++11

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

如何在没有拒绝服务漏洞的情况下安全地打开常规文件?

该标志O_DIRECTORY可以与系统调用中使用open(2)openat(2)打开的目录时避免拒绝服务漏洞.但是:如何避免常规文件的相同竞争条件?

一些背景信息:我正在尝试开发某种备份工具.程序遍历目录树,读取所有常规文件,只读取其他文件的统计信息.如果我首先调用fstatat(2)每个目录条目,测试常规文件的结果并打开它们openat(2),那么系统调用之间就存在竞争条件.攻击者可以使用FIFO替换常规文件,我的程序将挂起FIFO.

我怎样才能避免这种竞争条件?对于目录,可以使用O_DIRECTORY符号链接O_PATH.但是,我找不到常规文件的解决方案.我只需要一个适用于最新Linux版本的解决方案.

c linux filesystems

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

使用预处理器创建用户定义的文字

我正在尝试编写一个宏来从常规字符串文字中创建用户定义的文字.以下两行应该创建令牌"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)

如何正确地做到这一点?

c++ literals c++11

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

boost :: condition_variable - 使用带谓词的wait_for

我想等待一段时间的条件.我读了升压文件和它似乎是最好使用功能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谓词的正确方法是什么?

c++ multithreading boost boost-thread

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

Java 8身份映射lambda?

我想在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)?

java lambda java-8

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

什么样的参数可以在return语句中自动移动?

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++ c++11

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