boost::shared_mutex或std::shared_mutex(C++ 17)可用于单个写入器,多个读取器访问.作为一项教育练习,我将一个使用自旋锁的简单实现放在一起并具有其他限制(例如公平策略),但显然不打算在实际应用中使用.
我们的想法是,如果没有线程持有锁,则互斥锁保持引用计数为零.如果> 0,则该值表示有权访问的读者数.如果为-1,则单个编写者可以访问.
这是一个没有数据竞争的正确实现(特别是使用的,最小的内存排序)吗?
#include <atomic>
class my_shared_mutex {
std::atomic<int> refcount{0};
public:
void lock() // write lock
{
int val;
do {
val = 0; // Can only take a write lock when refcount == 0
} while (!refcount.compare_exchange_weak(val, -1, std::memory_order_acquire));
// can memory_order_relaxed be used if only a single thread takes write locks ?
}
void unlock() // write unlock
{
refcount.store(0, std::memory_order_release);
}
void lock_shared() // read lock
{
int val;
do {
do …Run Code Online (Sandbox Code Playgroud) 我按照官方指南为heroku部署了一个Laravel应用程序.它说要改变APP_LOG=errorlog,我已经完成了.
我也尝试了两种不同的版本,注释行是变体.
$this->app->configureMonologUsing(function($monolog){
// $monolog->pushHandler(new \Monolog\Handler\SyslogHandler('papertrail'));
$monolog->pushHandler(new \Monolog\Handler\StreamHandler('php://stderr', \Monolog\Logger::WARNING));
});
Run Code Online (Sandbox Code Playgroud)
如果我使用Log :: error('something')我什么都没看到.我正在查看papertrail和CLI命令heroku logs --tail --app {appname}
我试图将一个double转换(和舍入)到一个char数组,而不是先在double上转换为std :: to_string.但是,我正在接收随机内存文本.我究竟做错了什么?
这是我的代码:
double d = 1.0929998;
d = std::round(d * 100) / 100;
char s[sizeof(d)];
std::memcpy(s,&d,sizeof(d));
Run Code Online (Sandbox Code Playgroud)
结果:
s: q =×£pñ?
预期价值:
s: 1.09
我曾经使用以下行来在Java中出现流之前对元素进行排序:
Collections.sort(collection, new CustomComparator());
Run Code Online (Sandbox Code Playgroud)
现在我发现我可以通过以下方式获得相同的结果:
collection.stream().sorted(new CustomComparator());
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都使用一个列表和一个实现的自定义比较器Comparator(我需要这个并且不能在类本身上实现它).
我没有找到任何表明它们在任何方面都不同的东西,除了流解决方案看起来更好的事实.
使用流版本有什么好处吗?我的意思是......性能更高吗?有什么区别吗?
所以我正在学习 C++ 课程,在一次练习中,我需要在名为“Character”的类的构造函数中使用名为“Weapon”的类的构造函数,但是每次我尝试编译代码时,它都会给我这个错误:
Character.cpp|13|error: no match for call to `(Weapon) (int&,std::__cxx11::string&)’|
Run Code Online (Sandbox Code Playgroud)
即使我在 Weapon.h 中声明了这个确切的构造函数:
#ifndef WEAPON_H
#define WEAPON_H
#include <string>
class Weapon
{
public:
Weapon();
Weapon(int damage, std::string name);
virtual ~Weapon();
int GetDamage() { return m_damage; }
void SetDamage(int val) { m_damage = val; }
std::string GetName() { return m_name; }
void SetName(std::string val) { m_name = val; }
private:
int m_damage;
std::string m_name;
};
#endif // WEAPON_H
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我是法国人,这是我第一次发帖,但我尽力将源代码翻译成英文,如果某些行后面有任何错误或意外含义,请见谅。这是我的 Character.cpp / Weapon.cpp / Character.h 文件。
#include "Character.h"
#include "Weapon.h"
Character::Character() …Run Code Online (Sandbox Code Playgroud) 我正在使用 JUnit 4.12 和 Jackson
@Test
public void testFailToGetDataAsString() {
Receipt receipt = new Receipt(null);
assertNull(receipt.getDataAsString());
}
Run Code Online (Sandbox Code Playgroud)
我正在测试的方法如下(this.data 只是一个空映射):
public String getDataAsString() {
try {
return new ObjectMapper().writeValueAsString(this.data);
} catch (Exception e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
最后我运行测试并检查“null”是否不是“<null>”。
我正在使用 spring-boot 和 spring-security 制作一个网站,它更喜欢提供 freemarker 作为视图。我对ftl不太了解,现在我需要在我的ftl中使用 adminLTE 的 CSS 和 JS 文件,但是如何呢?
<html lang="en">
<#assign basePath=request.contextPath>
<#macro head>
...
<script src="${basePath}WEB-INF/AdminLTE/dist/js/adminlte.min.js"></script>
<link src="${basePath}WEB-INF/AdminLTE/plugins/iCheck/line/line.css" rel="stylesheet"></link>
<script src="${basePath}WEB-INF/AdminLTE/plugins/iCheck/icheck.js"></script>
...
<#macro>
Run Code Online (Sandbox Code Playgroud) c++ ×3
java ×2
c++11 ×1
c++14 ×1
c-strings ×1
collections ×1
constructor ×1
css ×1
double ×1
freemarker ×1
heroku ×1
html ×1
jackson ×1
java-stream ×1
junit ×1
laravel ×1
laravel-5 ×1
laravel-5.4 ×1
mutex ×1
oop ×1
sorting ×1
stdatomic ×1
string ×1