pthread问题;
看来条件变量只有在另一个线程调用pthread_cond_notify之前调用pthread_cond_wait时才有效.如果在等待之前以某种方式通知,则等待将被卡住;
我的问题是; 什么时候应该使用条件变量?调度程序可以抢占线程并在等待之前通知发生;
等待信号量没有这个问题 - 这些有一个计数器,还是什么时候条件变量更好?
这是一个测试
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
// test of conditional variables;
// if cond-var is notified before wait starts, then wait never wakes up !!!
// better to use semaphores than this crap.
pthread_mutex_t cond_var_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
int wait_first = 1;
void *tfunc(void *arg)
{
(void) arg;
if (!wait_first)
sleep(1);
fprintf(stderr,"on enter cond_var_lock %lx\n", pthread_self());
pthread_mutex_lock( &cond_var_lock);
fprintf(stderr,"before pthread_cond_wait %lx\n", pthread_self());
pthread_cond_wait( &cond_var, &cond_var_lock);
fprintf(stderr,"after pthread_cond_wait %lx\n", pthread_self()); …
Run Code Online (Sandbox Code Playgroud) 在GCC中,std :: list的size()方法是O(n).为什么?
for the C++ 11 in the standard说list的size()应该是O(1) http://en.cppreference.com/w/cpp/container/list/size
但是在glibc中我们有以下内容:
/usr/include/c++/4.6.3/bits/stl_list.h
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class list : protected _List_base<_Tp, _Alloc>
{
...
size_type
size() const
{ return std::distance(begin(), end()); }
Run Code Online (Sandbox Code Playgroud)
问题是:如何在海湾合作委员会中实施一项为期三年的要求?
编辑:gcc 5改变了这一点:虽然以ABI变化为代价; 这意味着使用gcc 5.0编译的c ++代码不适用于旧版本的c ++运行时库.
来自https://gcc.gnu.org/gcc-5/changes.html "默认情况下启用std :: list的新实现,带有O(1)size()函数"
realloc
在C++中没有; 当然,你总是可以分配一个新块new
,将旧块复制到新块,释放旧块delete
.
问题是realloc通常比这更快 - 当内存块"就地"重新调整大小时会发生这种情况 - 即返回值realloc
恰好与参数指针值相同; 这也避免了将内存从旧块复制到新块.
标准说什么 - 是否允许将全局new
运算符返回的指针传递给realloc
?(glibc中都new
与malloc
使用相同的分配,所以不应该在这里是一个实际问题).C++标准对此主题有什么要说的吗?
(当前glibc标准C++库不执行realloc,即使在向量中 - 因为一旦分配了一个对象,运行时就无法在旧内存块上调用析构函数并在新块上调用new new - 如果内存块被移动了realloc
.如果标准库有一个realloc
不能将参数块移动到新位置的就地,那会更简单)
实际上一些内存分配器具有就地realloc
功能; 这些当然是非标准的.
rallocm
带有标志的APIALLOCM_NO_MOVE
dlrealloc_in_place
如果您使用jemalloc或dlmalloc为全球运营商new
和delete
,那么你可以使用这些非标准的功能,在就地尝试了一个向量类realloc
之前它移动malloc
与复制.或者可以请求C++标准委员会在标准中添加全局非移动重新分配方法.
或者你可以做一个通过malloc
/ realloc
/ 来完成内存管理的向量类free
,但是如果元素类型是普通的旧数据(例如,如果std::is_pod
在向量所持有的类型上返回true),则只能实例化此实现.
在haskell前奏的定义中,我们看到它...
是为无法在Haskell中实现的表达式保留的.现在IO
monad例如无法在haskell中实现.
让我感到惊讶的是seq
前奏中定义如下
seq :: a -> b -> b
seq = ... -- Primitive
Run Code Online (Sandbox Code Playgroud)
为什么不以下?我错过了什么?
seq _ b = b
Run Code Online (Sandbox Code Playgroud) 在文件/usr/include/c++/4.8中的gcc 4.84中我们有
namespace std
{
typedef duration<int64_t, nano> nanoseconds;
Run Code Online (Sandbox Code Playgroud)
为什么纳秒的表示类型是有符号整数类型?为什么不签名?我们什么时候可以有一个负值的持续时间对象?