草庐IT

wait_until_present

全部标签

c++ - eventfd_read/write 与 sem_wait/post

在Linux上,在C/C++程序中,如果我不关心我的eventfd是否被用于“select”,那么使用eventfd_read/write(带有EFD_SEMAPHORE标志)还是sem_wait/post更好?是否存在任何性能、可靠性和可移植性问题?由于我的程序使用了一些其他的eventfd对象(带有“select”),我认为使用eventfd比使用sem_wait/post更一致。 最佳答案 sem_wait/sem_post完全是用户空间,除非sem_waitblock或sem_post发布到具有服务员。即使那样,它们执行的系

c - 为什么 wait4() 被 waitpid() 取代

我正在浏览系统调用的文档wait4()在它的手册页中写着Thesefunctionsareobsolete;usewaitpid(2)orwaitid(2)innewprograms.因此,我查看了waitpid()的文档我看到两者之间存在差异。waitpid()与wait4()做同样的事情,但是wait4(),根据手册页,additionallyreturnresourceusageinformationaboutthechildinthestructurepointedtobyrusage.两个系统调用定义如下pid_twait4(pid_tpid,int*status,intop

linux - Haproxy 中大量的 TIME_WAIT

我们将haproxy1.3.26托管在配备2.13GHzIntelXeon处理器的CentOS5.9机器上,该处理器充当众多服务的http和tcp负载均衡器,峰值吞吐量约为2000个请求/秒。它已经运行了2年,但流量和服务数量都在逐渐增加。我们观察到,即使在重新加载后,旧的haproxy进程仍然存在。在进一步调查中,我们发现旧进程有许多处于TIME_WAIT状态的连接。我们还看到netstat和lsof花费了很长时间。关于引用http://agiletesting.blogspot.in/2013/07/the-mystery-of-stale-haproxy-processes.ht

c++ - 使用epoll_wait时如何正确读取数据

我正在尝试将使用IOCP的现有WindowsC++代码移植到Linux。决定使用epoll_wait来实现高并发后,我已经面临着何时尝试处理接收到的数据的理论问题。假设有两个线程调用epoll_wait,并且接收到两条相应的消息,这样Linux就会解除对第一个线程的阻塞,并很快解除对第二个线程的阻塞。示例:Thread1blocksonepoll_waitThread2blocksonepoll_waitClientsendsachunkofdata1Thread1deblocksfromepoll_wait,performsrecvandtriestoprocessdataClien

c++ - sem_post(sem_t * sem) 和 sem_wait(sem_t * sem) 周围是否存在完整的内存屏障?

在linux代码中,我记得听说mutex_lock()周围有一个完整的内存屏障。我想确定它是否也在sem_xxx附近。 最佳答案 权威答案在这里:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11Applicationsshallensurethataccesstoanymemorylocationbymorethanonethreadofcontrol(threadsorprocesses)isrestrictedsuc

c - Linux fork() 和 wait()

我有一个难闻的问题:(我有这个代码:intmain(){pid_tchild,parent;intstatus=0;inti;printf("parent=%d\n",getpid());for(i=1;i0){printf("Exit=%d,child=%d\n",status/256,parent);}}输出类似于:1,213202,21321Exit=0,child=213213,21322Exit=0,child=213224,21323Exit=0,child=213235,21324Exit=0,child=21324而且我认为wait(0)不是等待所有子进程,而是只等待第

linux - 如果一个文件在边沿触发调用epoll_ctl之前是可读的,那么后续的epoll_wait是否会立即返回?

如果文件在epoll_ctl调用之前已经可读,那么epoll是否保证在为EPOLLIN和EPOLLET注册文件后,第一次(或正在进行的)对epoll_wait的调用会立即返回?从我对测试程序的实验来看,答案似乎是肯定的。这里有几个例子来澄清我的问题:假设我们已经初始化了一个epoll文件efd和一个文件fd以及下面的事件定义:event.data.fd=fd;event.events=EPOLLIN|EPOLLET;现在考虑这个场景:thread1:写入数据到fdthread2:epoll_ctl(efd,EPOLL_CTL_ADD,fd,&event);thread2:epoll_w

c - 是否有设置超时的 wait() 系统调用版本?

除了使用忙等待或忙休眠循环之外,还有什么方法可以使用带超时的wait()系统调用?我有一个父进程,fork是它自己,exec是一个子可执行文件。然后它等待child完成,通过任何适当的方式获取其输出,并执行进一步的处理。如果进程在一定时间内没有完成,它会认为它的执行超时,并做其他事情。不幸的是,鉴于问题的性质,这种超时检测是必要的。 最佳答案 没有等待超时的等待调用。您可以改为安装一个信号处理程序,为SIGCHLD设置一个标志,并使用select()实现超时。select()将被信号中断。staticvolatileintpunt;

c++ - waitpid 和 pthread_cond_wait(3)

我正在开发一个使用生产者和消费者线程的Linux应用程序。这是一个相当成熟的应用程序,我不想不必要地更改架构。生产者和消费者线程通过可等待队列链接。这是一个通过std::queue与条件变量和互斥量一起实现的类。现在我希望消费者线程能够派生/执行一个子进程,并等待直到子进程完成,或者可等待队列非空,以先发生者为准。如果可等待队列非空,则必须终止子进程。编辑:子进程是无法更改的第三方应用。一种可能是在子进程终止时在我的条件变量上调用pthread_cond_signal(),但如何实现呢?我不能为SIGCHLD使用处理程序,至少不能直接使用,因为manpage说pthread_cond_

linux - 用非 IO 事件中断 epoll_wait,无信号

当前场景是epoll_wait在几个fds和一个可能的传入消息队列上,我希望epoll_wait下面的循环在IO事件或新消息上执行。我知道的方法:使用time毫秒超时并在循环中首先检查队列使用self-pipetrick当消息可用时从队列代码中获取用标准信号中断系统调用使用epoll_pwait并细化前一点上面的几点都不让我满意,我想知道是否还有其他我没有找到的方法。原因是:在多线程代码中要避免信号,而且不是很可靠Timeoutone消除了epoll的部分好处,仅通过事件唤醒Self-pipetrick看起来是目前最好的方法,但样板代码仍然太多想法? 最佳答