草庐IT

lock-free

全部标签

c - 使用 mmap 和 munmap 实现你自己的 malloc/free

我使用mmap实现了自己的ma​​lloc和free。现在由于与free不同,munmap也将长度作为参数,因此我将长度作为附加信息放在映射内存中。我的ma​​lloc和free的代码如下所示。我想问一下,如果这段代码很好,或者我是否仍然遗漏任何东西或以错误的方式做某事。void*malloc(size_tsize){int*plen;intlen=size+sizeof(size);//Addsizeof(size)forholdinglength.plen=mmap(0,len,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0);

c - asprintf() : how to free the pointers?

我有这样的代码:我分配了两次log,第一个&log是否有潜在的内存泄漏?char*log=NULL;asprintf(&log,"Hello:%s",name);if(known_person==true){asprintf(&log,"%s,%s",log,",myoldfriend.");}free(log); 最佳答案 是的,代码会泄漏,因为asprintf既不检查也不尝试重用前一个指针。因此,内存只是丢失了。避免示例中问题的最佳方法是将代码重写为char*log=NULL;if(known_person==true)aspr

c - asprintf() : how to free the pointers?

我有这样的代码:我分配了两次log,第一个&log是否有潜在的内存泄漏?char*log=NULL;asprintf(&log,"Hello:%s",name);if(known_person==true){asprintf(&log,"%s,%s",log,",myoldfriend.");}free(log); 最佳答案 是的,代码会泄漏,因为asprintf既不检查也不尝试重用前一个指针。因此,内存只是丢失了。避免示例中问题的最佳方法是将代码重写为char*log=NULL;if(known_person==true)aspr

c - Linux 内核 : Spinlock SMP: Why there is a preempt_disable() in spin_lock_irq SMP version?

Linux内核中的原始代码是:staticinlinevoid__raw_spin_lock_irq(raw_spinlock_t*lock){local_irq_disable();preempt_disable();spin_acquire(&lock->dep_map,0,0,_RET_IP_);LOCK_CONTENDED(lock,do_raw_spin_trylock,do_raw_spin_lock);}我认为在禁用本地IRQ后,没有执行路径可以抢占当前路径。因为所有常见的硬IRQ都被禁用,所以应该没有软中断发生,也没有ticktokickschedulewheel。我认

c - Linux 内核 : Spinlock SMP: Why there is a preempt_disable() in spin_lock_irq SMP version?

Linux内核中的原始代码是:staticinlinevoid__raw_spin_lock_irq(raw_spinlock_t*lock){local_irq_disable();preempt_disable();spin_acquire(&lock->dep_map,0,0,_RET_IP_);LOCK_CONTENDED(lock,do_raw_spin_trylock,do_raw_spin_lock);}我认为在禁用本地IRQ后,没有执行路径可以抢占当前路径。因为所有常见的硬IRQ都被禁用,所以应该没有软中断发生,也没有ticktokickschedulewheel。我认

c - 如何实现无锁但阻塞的行为?

我正在为一个密集型网络应用程序实现一个无锁的单一生产者单一消费者队列。我有一堆工作线程在它们自己单独的队列中接收工作,然后它们出队并处理。从这些队列中移除锁在高负载下大大提高了性能,但当队列为空时它们不再阻塞,这反过来导致CPU使用率飙升。我怎样才能有效地导致线程阻塞,直到它可以成功地使某些东西出队或被杀死/中断? 最佳答案 如果您使用的是Linux,请考虑使用Futex.它通过使用原子操作而不是像互斥锁那样的内核调用来提供非锁定实现的性能,但是如果由于某些条件不成立(即锁定争用)而需要将进程设置为空闲,它将然后进行适当的内核调用以

c - 如何实现无锁但阻塞的行为?

我正在为一个密集型网络应用程序实现一个无锁的单一生产者单一消费者队列。我有一堆工作线程在它们自己单独的队列中接收工作,然后它们出队并处理。从这些队列中移除锁在高负载下大大提高了性能,但当队列为空时它们不再阻塞,这反过来导致CPU使用率飙升。我怎样才能有效地导致线程阻塞,直到它可以成功地使某些东西出队或被杀死/中断? 最佳答案 如果您使用的是Linux,请考虑使用Futex.它通过使用原子操作而不是像互斥锁那样的内核调用来提供非锁定实现的性能,但是如果由于某些条件不成立(即锁定争用)而需要将进程设置为空闲,它将然后进行适当的内核调用以

linux - 如何在 "glibc detected *** free(): invalid pointer"上强制中止

在Linux环境下,当出现“glibcdetected***free():invalidpointer”错误时,如何识别是哪一行代码导致的?有没有办法强制中止?我记得有一个ENV变量来控制它?如何在gdb中为glibc错误设置断点? 最佳答案 我相信如果您将envMALLOC_CHECK_设置为2,glibc将在检测到“free():无效指针”错误时调用abort()。请注意环境变量名称中的尾部下划线。如果MALLOC_CHECK_为1,glibc将打印“free():invalidpointer”(和其他错误的类似printfs)

linux - 如何在 "glibc detected *** free(): invalid pointer"上强制中止

在Linux环境下,当出现“glibcdetected***free():invalidpointer”错误时,如何识别是哪一行代码导致的?有没有办法强制中止?我记得有一个ENV变量来控制它?如何在gdb中为glibc错误设置断点? 最佳答案 我相信如果您将envMALLOC_CHECK_设置为2,glibc将在检测到“free():无效指针”错误时调用abort()。请注意环境变量名称中的尾部下划线。如果MALLOC_CHECK_为1,glibc将打印“free():invalidpointer”(和其他错误的类似printfs)

php - flock 中的 LOCK_NB 是什么意思?

PHPflock命令中的LOCK_NB是什么意思? 最佳答案 LOCK_NB表示非阻塞。通常当您尝试锁定文件时,您的PHP脚本将停止执行。调用flock()然后阻止它恢复。它会一直这样做,直到删除所访问文件的并发锁。大多数情况下,您的进程是唯一一个尝试锁定文件的进程,因此对flock的阻塞调用实际上会立即返回。只有当两个进程锁定同一个文件时,其中一个才会暂停。不过,LOCK_NB标志将使flock()在任何情况下立即返回。在该设置中,您必须检查返回的状态以查看您是否确实获得了锁。例如:while(!flock($f,LOCK_NB)