投票结束之前,请先阅读,我知道有类似的问题(:
这是我的情况-我有一个多线程应用程序。因此,可以说我有10个线程。它们都从同一个文件描述符(实际上是一个socket)中读取。并且在非常罕见的情况下,当发生严重错误时,套接字应通过其中一个线程为shutdown。问题是,这些线程中的任何一个都可以做到这一点。如果关闭套接字失败,则会执行_Exit( FAILURE )(我知道,这听起来像是一个糟糕的设计或代码问题,但实际上并非如此,因为这是由非开源第三方lib引起的,那有个错误)。
这是问题所在-可能所有人都尝试同时shutdown。一个关闭它,但另一个关闭它(由于套接字已经关闭,shutdown返回-1),并且错误的_Exit( FAILURE )被执行,这毁了一切。
显然,我需要进行额外的检查-如果套接字已经关闭(可能所有线程由于某种原因无法关闭套接字,然后至少有一个线程必须执行_Exit,这就是为什么检查还不够)。
好吧,我发现了这个问题,看起来这正是我要尝试的方法。
但是我知道,任何类型的系统调用都需要时间(当然),并且套接字完全关闭的时间取决于操作系统。
问题是-如果套接字已经关闭或由于某种原因无法关闭,我该如何改变? fcntl是否可以确保我,如果一个线程关闭了套接字,并且同时另一个线程尝试了shutdown套接字,它将失败,然后,如果我进行此检查(使用fcntl),这对我有用吗?
我还看到了其他答案,例如:"可以使用select或poll",但是它们仍然是系统调用&#