我有一个time.Time价值time.Now(),我希望得到另一个时间,正好是1个月前.
我知道减法是可能的time.Sub()(它想要另一个time.Time),但这将导致a time.Duration,我需要它反过来.
我正在阅读一些代码并说几种不同的方式来传递频道.也许他们是一样的,但我想知道是否有任何差异,因为我在网上找不到文件:
1)
func serve(ch <-chan interface{}){ //do stuff }
Run Code Online (Sandbox Code Playgroud)
2)
func serve(ch chan<- interface{}){ //do stuff }
Run Code Online (Sandbox Code Playgroud)
3)
func serve(ch chan interface{}){ //do stuff }
Run Code Online (Sandbox Code Playgroud)
4)
func server(ch *chan interface{}){ //do stuff}
Run Code Online (Sandbox Code Playgroud)
我想知道它们之间有什么区别,如果它们只是等同的方式来做同样的事情:在不同的goroutines周围传递一个通道.
注意:我知道没有理由将指针传递给chan,map或slice或函数值,因为这些都是内部包含指针的引用类型(如果您希望被调用者更改,则会出现异常引用类型标题).我提供它的唯一原因是为了完整性(即真正提供可以尝试将通道作为参数传递的每种方式,并且有希望地提出问题,引用所有方法来进行此操作并对它们进行比较).
我正在寻找一个clang-format设置来防止该工具删除换行符.
例如,我将我的ColumnLimit设置设置为120,这是我重新格式化一些示例代码时会发生的情况.
之前:
#include <vector>
#include <string>
std::vector<std::string> get_vec()
{
return std::vector<std::string> {
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines"
};
}
int main()
{
auto vec = get_vec();
}
Run Code Online (Sandbox Code Playgroud)
后:
#include <vector>
#include <string>
std::vector<std::string> get_vec()
{
return std::vector<std::string>{"this is a test", "some of the lines are longer", "than other, but I would like",
"to keep them on separate lines"}; …Run Code Online (Sandbox Code Playgroud) 我的项目包含几个共享一些常用代码的可执行文件.我想将公共代码放在可执行文件可以链接到的静态库中.(公共代码非常小,我不想处理共享库).
源树看起来像这样:
app1和app2都依赖于共同的代码.
此公共代码非常特定于应用程序,并且永远不需要由此目录树之外的其他项目使用.出于这个原因,我宁愿不在任何类型的全球位置安装库.
顶级CMakeLists.txt文件只是添加子目录:
project(toplevel)
cmake_minimum_required(VERSION 3.1)
add_subdirectory(common)
add_subdirectory(app1)
add_subdirectory(app2)
Run Code Online (Sandbox Code Playgroud)
公共库的CMakeLists.txt文件创建静态库并设置包含目录:
add_library(common STATIC common.cpp)
target_include_directories(common PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
Run Code Online (Sandbox Code Playgroud)
可执行文件的文件如下所示:
project(app1)
cmake_minimum_required(VERSION 3.1)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} common)
Run Code Online (Sandbox Code Playgroud)
现在我的问题.如果我从顶级项目目录运行CMake,我可以构建app1和app2并且它们可以成功构建.但是,如果我想构建这些项目中的单个项目(例如,通过从app1运行CMake)而不是从顶级目录构建,我会收到错误,因为common/include它没有添加到标题搜索路径中.
我明白为什么会这样.用于app1或app2的CMakeLists.txt文件中没有任何内容可以"拉入"常见内容.这只在顶层完成.
有没有解决方法,或者这种行为通常被认为是可接受的?关于我的设置是次优的吗?我只是觉得能够在我们开始开发越来越多使用这个公共库的可执行文件的情况下单独构建项目而不是从顶级构建项目会很好,但也许这是我不应该做的事情.关心.
当我执行'git log'时,为什么提交的日期不按顺序?
我正在查看我的存储库的1个分支.日期应该是有序的,对吗?
我正在阅读Bjarne Stroustrup的C++ 11 FAQ,我无法理解内存模型部分中的示例.
他给出了以下代码片段:
// start with x==0 and y==0
if (x) y = 1; // thread 1
if (y) x = 1; // thread 2
Run Code Online (Sandbox Code Playgroud)
FAQ说这里没有数据竞争.我不明白.内存位置x由线程1读取并由线程2写入而没有任何同步(并且同样适用y).这是两次访问,其中一次是写入.这不是数据竞争的定义吗?
此外,它说"每个当前的C++编译器(我所知道的)给出了正确答案." 这个正确答案是什么?根据一个线程的比较是在另一个线程的写入之前或之后发生(或者另一个线程的写入是否对读取线程可见),答案是否会有所不同?
我正在使用Guava的EventBus来启动一些处理和报告结果.这是一个非常简单的可编译示例:
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
public class Test {
public static class InitiateProcessing { }
public static class ProcessingStarted { }
public static class ProcessingResults { }
public static class ProcessingFinished { }
public static EventBus bus = new EventBus();
@Subscribe
public void receiveStartRequest(InitiateProcessing evt) {
System.out.println("Got processing request - starting processing");
bus.post(new ProcessingStarted());
System.out.println("Generating results");
bus.post(new ProcessingResults());
System.out.println("Generating more results");
bus.post(new ProcessingResults());
bus.post(new ProcessingFinished());
}
@Subscribe
public void processingStarted(ProcessingStarted evt) {
System.out.println("Processing has started");
}
@Subscribe
public void resultsReceived(ProcessingResults …Run Code Online (Sandbox Code Playgroud) 在过去一周左右的时间里,我一直在阅读严格的别名规则并进入本文:了解C/C++严格别名.
本文通过几种方式将两个交换32位整数的两半进行交换,给出了良好的示例和违反严格别名规则的示例.但是,我无法理解其中一个例子.
此代码被描述为已损坏.
uint32_t
swaphalves(uint32_t a)
{
a = (a >> 16) | (a << 16);
return a;
}
Run Code Online (Sandbox Code Playgroud)
给出的理由是:
这个版本看起来很合理,但你不知道|的左右两侧 将各自获得原始版本,
a或者如果其中一个将获得另一个的结果.这里没有序列点,因此我们对此处的操作顺序一无所知,并且您可能会使用不同级别的优化从同一编译器获得不同的结果.
我不同意.这段代码对我来说很好看.a在该a = (a >> 16 | (a << 16);行中只有一个写入,我希望a在写入之前进行两次读取.此外,没有指针或引用,也没有不兼容的类型.
我在此代码中是否缺少严格的别名冲突,或者文章是否不正确?
我有一个简单的字符设备驱动程序,允许您从自定义硬件设备读取.它使用DMA将数据从设备的内存复制到内核空间(然后再复制到用户).
该read调用非常简单.它启动DMA写入,然后等待等待队列.当DMA完成时,中断处理程序设置一个标志并唤醒等待队列.需要注意的重要一点是,我可以随时启动DMA,甚至在设备提供数据之前.DMA引擎将等待,直到有数据要复制.这很好用.我可以在用户空间中实现一个简单的阻塞读取调用,它的行为与我期望的一样.
我想实现,poll以便我可以select在用户空间中使用系统调用,允许我同时监视此设备和套接字.
我能找到的大部分资源poll都说:
poll_wait可能表示状态发生变化的每个等待队列第二部分让我感到困惑.我见过的大多数示例都有一种简单的方法(指针比较或状态位)来检查数据是否可用.在我的情况下,除非我启动DMA,否则数据将永远不可用,即使我这样做,数据也不会立即可用(在设备实际拥有数据和DMA完成之前可能需要一些时间).
那怎么实现呢?该poll函数是否应该实际启动DMA以使数据最终可用?我想这会破坏我的read功能.
我无法让CMake找到带有Linaro ARM工具链的线程(我尝试了几种不同的工具).这就是我所做的:
/opt.~/sysroot我创建了一个Toolchain-Linaro-arm.cmake文件,如下所示:
set (CMAKE_SYSTEM_NAME Linux)
include (CMakeForceCompiler)
set (TOOLCHAIN_BASE "/opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf/")
set (CMAKE_SYSTEM_PROCESSOR armhf-cortexa9)
CMAKE_FORCE_C_COMPILER("${TOOLCHAIN_BASE}/bin/arm-linux-gnueabihf-gcc" GNU)
CMAKE_FORCE_CXX_COMPILER("${TOOLCHAIN_BASE}/bin/arm-linux-gnueabihf-g++" GNU)
set (CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} /home/user/sysroot)
set (CMAKE_SIZEOF_VOID_P 4)
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
Run Code Online (Sandbox Code Playgroud)
我创建了一个使用线程的最小示例项目:
~/threadstest $ ls
CMakeLists.txt main.cpp
~/threadstest $ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.0.0)
project(threads_test)
add_executable(test main.cpp)
find_package(Threads REQUIRED)
target_link_libraries(test, ${CMAKE_THREAD_LIBS_INIT})
~/threadstest $ cat main.cpp
int main() { }
~/threadstest $ mkdir build; cd build
~/threadstest/build …Run Code Online (Sandbox Code Playgroud) c++ ×3
cmake ×2
go ×2
c ×1
c++11 ×1
channel ×1
clang ×1
clang-format ×1
concurrency ×1
driver ×1
git ×1
guava ×1
java ×1
linaro ×1
linux ×1
linux-kernel ×1
memory-model ×1
pthreads ×1
select ×1