3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以使用管道來通知線程您希望其退出。然后,您可以select()在管道和監(jiān)聽套接字上進(jìn)行選擇的呼叫。
例如(編譯但未完全測(cè)試):
// NotifyPipe.h
#ifndef NOTIFYPIPE_H_INCLUDED
#define NOTIFYPIPE_H_INCLUDED
class NotifyPipe
{
int m_receiveFd;
int m_sendFd;
public:
NotifyPipe();
virtual ~NotifyPipe();
int receiverFd();
void notify();
};
#endif // NOTIFYPIPE_H_INCLUDED
// NotifyPipe.cpp
#include "NotifyPipe.h"
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
NotifyPipe::NotifyPipe()
{
int pipefd[2];
int ret = pipe(pipefd);
assert(ret == 0); // For real usage put proper check here
m_receiveFd = pipefd[0];
m_sendFd = pipefd[1];
fcntl(m_sendFd,F_SETFL,O_NONBLOCK);
}
NotifyPipe::~NotifyPipe()
{
close(m_sendFd);
close(m_receiveFd);
}
int NotifyPipe::receiverFd()
{
return m_receiveFd;
}
void NotifyPipe::notify()
{
write(m_sendFd,"1",1);
}
然后select使用receiverFd(),并使用通知終止notify()。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
使用shutdown()
調(diào)用關(guān)閉套接字。這將喚醒所有阻塞的線程,同時(shí)保持文件描述符有效。
close()
在描述符上,另一個(gè)線程B使用具有內(nèi)在的危險(xiǎn):另一個(gè)線程C可能會(huì)打開一個(gè)新的文件描述符,然后線程B將使用該文件描述符而不是已關(guān)閉的文件描述符。dup2()
一/dev/null
到就避免了這個(gè)問題,但沒有醒來阻塞的線程可靠。
請(qǐng)注意,shutdown()
僅適用于套接字-對(duì)于其他類型的描述符,您可能需要select + pipe-to-self或cancel方法。

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果pthread實(shí)現(xiàn)無法正確實(shí)現(xiàn)取消,則pthread_cancel取消被accept()阻塞的線程是有風(fēng)險(xiǎn)的,也就是說,如果線程創(chuàng)建了一個(gè)套接字,則在返回代碼之前,將為其調(diào)用pthread_cancel(),該線程為取消,并且新創(chuàng)建的套接字泄漏。盡管FreeBSD 9.0和更高版本沒有這種競(jìng)爭(zhēng)狀況問題,但是您應(yīng)該首先檢查操作系統(tǒng)。
添加回答
舉報(bào)