const 发布的文章

“const”

event.h

#ifndef EVENT_H
#define EVENT_H

#include <fcntl.h>
#include <atomic>
#include <time.h>
#include <semaphore.h>
#include <string>

using std::string;
using std::atomic_bool;

class CEvent 
{
    private:
        CEvent(long lpEventAttributes, bool bManualReset, bool bInitialState, const char* lpName);
        ~CEvent();
        bool Init();
        timespec sem_get_time_millsecs(long msecs);
    public:
        enum 
        {
            WAIT_OBJECT_0 = 0,
            WAIT_TIMEOUT = 0x00000102L,
            WAIT_FAILED = 0xFFFFFFFF
        };
        //S_IRWXU
        static CEvent* CreateEvent(long lpEventAttributes, bool bManualReset, bool bInitialState, const char* lpName);
        static CEvent* CreateEvent(bool bManualReset, bool bInitialState, const char* lpName);
        static void CloseHandle(CEvent* &p_event);
        static unsigned long WaitForSingleObject(CEvent* p_event, long ms);
        /// 触发事件
        static bool SetEvent(CEvent* p_event);
        /// 复位事件
        static bool ResetEvent(CEvent* p_event);
    private:
        bool _b_manual_reset;
        atomic_bool _b_initial_state;
        sem_t* _p_named_sem = SEM_FAILED;
        sem_t  _sem;
        string    _sem_name;
        long _lpEventAttributes;
        int _sem_count = 0;
};

#endif

event.cpp

#include "event.h"
#include "unistd.h"

CEvent::CEvent(long lpEventAttributes, bool bManualReset, bool bInitialState, const char* lpName) 
{
    _lpEventAttributes = lpEventAttributes;
    _b_manual_reset = bManualReset;
    _b_initial_state = bInitialState;
    if (lpName != nullptr) _sem_name = lpName;
}

CEvent::~CEvent()
{
    if (_p_named_sem != SEM_FAILED)
    {
        if (_sem_name.empty())
        {
            sem_destroy(&_sem);
            _p_named_sem = SEM_FAILED;
        }
        else 
        {
            sem_close(_p_named_sem);
            sem_unlink(_sem_name.c_str());
            _sem_name.clear();
        }
    }
}

bool CEvent::Init()
{
    if (_b_initial_state) 
        _sem_count = 1;
    else 
        _sem_count = 0;
    if (_sem_name.empty())
    {
        if (0 != sem_init(&_sem, 0, _sem_count))
        {
            _p_named_sem = SEM_FAILED;
            return false;
        }
        _p_named_sem = &_sem; 
    }
    else 
    {
        _p_named_sem = sem_open(_sem_name.c_str(), O_CREAT, _lpEventAttributes, _sem_count);
        if (_p_named_sem == SEM_FAILED)
        {
            sem_unlink(_sem_name.c_str());
            _sem_name.clear();
            return false;
        }
    }
    return true;
}
timespec CEvent::sem_get_time_millsecs(long msecs)
{
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    long secs = msecs / 1000;
    msecs = msecs % 1000;

    long add = 0;
    msecs = msecs * 1000 * 1000 + ts.tv_nsec;
    add = msecs / (1000 * 1000 * 1000);
    ts.tv_sec += (add + secs);
    ts.tv_nsec = msecs % (1000 * 1000 * 1000);
    return ts;
}
CEvent* CEvent::CreateEvent(long lpEventAttributes, bool bManualReset, bool bInitialState, const char* lpName) 
{
    CEvent* p_event = new CEvent(lpEventAttributes, bManualReset, bInitialState, lpName);
    if (!p_event->Init())
    {
        delete p_event;
        return nullptr;
    }
    return p_event;
}
CEvent* CEvent::CreateEvent(bool bManualReset, bool bInitialState, const char* lpName) 
{
    CEvent* p_event = new CEvent(S_IRWXU, bManualReset, bInitialState, lpName);
    if (!p_event->Init())
    {
        delete p_event;
        return nullptr;
    }
    return p_event;
}
void CEvent::CloseHandle(CEvent* &p_event) 
{
    if (p_event != nullptr)
        delete p_event;
    p_event = nullptr;
}

unsigned long CEvent::WaitForSingleObject(CEvent* p_event, long ms)
{
    if (p_event == nullptr)
        return WAIT_FAILED;
    if (p_event->_b_initial_state) 
    {
        if (!p_event->_b_manual_reset) 
        {
            p_event->_b_initial_state = false;
            while (sem_getvalue(p_event->_p_named_sem, &p_event->_sem_count) == 0 && p_event->_sem_count > 0)
                sem_wait(p_event->_p_named_sem);
        }
        return WAIT_OBJECT_0;
    }
    if (ms == 0) 
    {
        int n_ret = sem_wait(p_event->_p_named_sem);
        if (n_ret != 0)
            return WAIT_FAILED;
    }
    else 
    {
        int n_ret = 0;
        timespec ts = p_event->sem_get_time_millsecs(ms);
        while ((n_ret = sem_timedwait(p_event->_p_named_sem, &ts)) == -1 && errno == EINTR)
            continue;       
        if (n_ret == -1) 
        {
            if (errno == ETIMEDOUT)
                return WAIT_TIMEOUT;
            else
                return WAIT_FAILED;
        }
    }
    if (p_event->_b_manual_reset)
        p_event->_b_initial_state = true;
    return WAIT_OBJECT_0;
}
bool CEvent::SetEvent(CEvent* p_event)
{
    if (p_event == nullptr) return false;
    int n_ret = sem_post(p_event->_p_named_sem);
    if (n_ret != 0)
        return false;
    return true;
}
bool CEvent::ResetEvent(CEvent* p_event)
{
    if (p_event == nullptr) return false;
    p_event->_b_initial_state = false;
    while (sem_getvalue(p_event->_p_named_sem, &p_event->_sem_count) == 0 && p_event->_sem_count > 0)
        sem_wait(p_event->_p_named_sem);
    return true;
}
#ifdef EVENT_DEMO
/// g++ event.cpp -DEVENT_DEMO -o event-demo -lpthread
void* thread_func(void* arg)
{
    CEvent *p = (CEvent*)arg;
    int i = 0;
    while(1)
    {
        i++;
        sleep(1);
        if(i >= 5)CEvent::SetEvent(p);
        printf("sleep %d s\n", i);
    }
    return nullptr;
}
int main(int argc, char* argv[])
{
    printf("event-demo\n");
    CEvent *event = CEvent::CreateEvent(true, false, "sec1");
    pthread_t tid;
    pthread_create(&tid, NULL, thread_func, event);
    pthread_detach(tid);

    if(CEvent::WaitForSingleObject(event, 10*1000)==CEvent::WAIT_OBJECT_0)
    {
        printf("wait event ok\n");
        CEvent::ResetEvent(event);
    }
    CEvent::CloseHandle(event);
    return 0;
}
#endif

编译命令
g++ event.cpp -DEVENT_DEMO -o event-demo -lpthread

运行结果:

./event-demo
event-demo
sleep 1 s
sleep 2 s
sleep 3 s
sleep 4 s
sleep 5 s
wait event ok

《尚气与十环传奇》于2021年11月12日在Disney+上线,所以最迟这个时间点就会有magnet下载可以看了,现在的版本都太模糊,没有什么下载意义。
 
ShangChi.png

《尚气与十环传奇》于2021年8月16日在洛杉矶的埃尔卡皮坦剧院和中国戏院首映,于2021年8月25日在拉斯维加斯的CinemaCon影展上映,于2021年9月2日在香港和台湾公映,于2021年9月3日在美国公映。影片属于漫威电影宇宙第四阶段。

2019年7月20日,漫威在圣地亚哥国际漫画展上公布《尚气与十环传奇》原计划于2021年2月12日在美国上映,当日为中国夏历辛丑年的春节。2020年4月3日,受2019冠状病毒病疫情的影响,影片上映时间被推迟至2021年5月7日(原《奇异博士2》档期)。2020年9月23日,因应《黑寡妇》延期上映,漫威宣布《尚气与十环传奇》的上映日期推迟至2021年7月9日[103]。《尚气与十环传奇》原计划于2021年7月8日在香港上映[8]。2021年3月23日,迪士尼正式宣布影片在美国戏院的首映时间第三次被推迟至2021年9月3日,但和《失控玩家》一样,《尚气与十环传奇》不会在串流媒体平台Disney+通过Disney+首映许可证形式与戏院同期上线,而是在戏院上映的45天之后在Disney+播出。2021年8月,随着感染Delta变种病毒的相关病例开始增长,迪士尼执行长鲍伯·查佩克称《尚气与十环传奇》仍首先仅在戏院上映,45天之后在Disney+播出,并称这种策略是个“有趣的实验”。主演刘思慕对此说法表示不满,凯文·费奇稍后回应称刘思慕似乎误解了查佩克的说法。

《尚气与十环传奇》原计划于2021年9月在中国大陆上映。2021年5月,中国中央电视台电影频道(CCTV-6)播出漫威电影展望预告片时,未见《尚气与十环传奇》和《永恒族》,外界猜测这两部电影将不能在中国大陆市场上映。外界评论称梁朝伟在电影中饰演的角色仍然被中国当局视为“辱华”,因此受到抵制。

《尚气与十环传奇》原计划于2021年10月7日在马来西亚上映。但因为《007:无暇赴死》在马来西亚的发行商联合国际影业(UIP)于9月24日紧急宣布撤档后,改为提前至2021年9月30日上映。

《尚气与十环传奇》于2021年11月12日在Disney+上线

符合条件的公共租赁住房的承租人、共有产权住房承购人及共同居住人可以将户籍迁入公共租赁住房、共有产权住房。公共租赁住房租赁合同解除,或共有产权住房发生产权转移的,应当同时履行将公共租赁住房、共有产权住房内的户籍迁出的义务。无处落户的,迁至区政府公共集体户口。

公租房/共有产权住房限制

住户应按照规定及公共租赁住房租赁合同和共有产权住房买卖合同、共有协议约定使用住房,并配合市住房保障办公室及运营单位按规定进行的巡查工作,不得有以下行为:

  (一)违反规定或者约定擅自互换、出租、转租、转让、抵押、赠与住房或者共有产权住房产权份额;

工程建设、设备安装、房地产中介等商业机构,不得为公共租赁住房和共有产权住房违规提供建设、安装及中介等服务。

第八条
因生活或者医疗需要,公共租赁住房和共有产权住房住户的直系亲属、必需的看护人员需要在住房内共同居住的,应当在入住前将有关信息告知运营单位。运营单位对允许共同居住情况予以登记并做好日常监管。

未经其他产权共有人书面同意,共有产权住房的承购人不得单方对共有产权住房设立居住权。共有产权住房的承购人去世,继承人在本市无自有住房的,可以提交继承公证文件后重新与代持管理机构签订《共有产权住房共有协议》、继承承购人产权份额作为共有产权住房继续居住使用;继承人在本市有自有住房或者虽无自有住房但选择转让共有产权住房的,应按规定办理转让手续,继承转让收益。

转让或者换购共有产权住房的,办理转让手续时应当腾退住房,暂时无法腾退的,可以按上一年度房屋租金参考价向产权受让方租赁所出让的共有产权住房临时居住,但最长租期不得超过一年。

既有公共租赁住房和共有产权住房物业管理区域或者楼栋应在2年内逐步配备人脸识别、指纹密码等智能化安保系统,替代非必要巡查程序;新建、配建公共租赁住房和共有产权住房物业管理区域或者楼栋应在交付使用前完成配备。

公共租赁住房和共有产权住房物业管理区域及时纳入社区管理,符合条件的公共租赁住房承租人、共有产权住房承购人及共同居住人可以将户籍迁入公共租赁住房、共有产权住房。公共租赁住房租赁合同解除,或者共有产权住房发生产权转移的,应当同时履行将公共租赁住房、共有产权住房内的户籍迁出的义务,无处落户的,迁至区政府公共集体户口;拒不迁出的,由公共租赁住房、共有产权住房产权人及其委托的运营单位申请将其户籍迁至区政府公共集体户口。

市住房保障办公室会同运营单位,对公共租赁住房承租人家庭、共有产权住房承购人家庭的持有本市住房情况,通过大数据比对等方式每年定期进行核查,发现承租人家庭或者承购人家庭持有其他住房并且未按规定主动申报的,由市住房保障办公室向公共租赁住房承租人发出《终止住房保障决定书》并收回住房,或者由代持管理机构责成共有产权住房承购人限期改正并追究其违约责任。

运营单位应按合同、协议约定,由服务督导员、物业管理人员进行公共租赁住房和共有产权住房居住使用情况巡查,及时掌握住户家庭人员变化、房屋使用、室内设施状况等情况,并做好巡查记录建档管理。公共租赁住房在一个租赁合同期内应全部进行轮流巡查;同时,每年按不少于30%的户数进行“双随机、一公开”抽查。对两年内没有违规使用记录、没有发现违规使用线索的住房,每年巡查不超过1次。

  组织巡查时,服务督导员、物业管理人员应不少于2人并按照规定佩戴、出示工作证件,当场向住户发出《巡查通知书》,告知巡查内容及巡查方式,得到住户同意后方可进入户内,并由住户在场全程陪同。巡查应遵守尊重住户生活习惯、工作快捷简短、取得信息最少够用、严格保护个人隐私的原则。

  既有公共租赁住房和共有产权住房物业管理区域或者楼栋应在2年内逐步配备人脸识别、指纹密码等智能化安保系统,替代非必要巡查程序;新建、配建公共租赁住房和共有产权住房物业管理区域或者楼栋应在交付使用前完成配备。

from:http://www.gz.gov.cn/gfxwj/sbmgfxwj/gzszfhcxjsj/content/post_7821463.html

业内人士:地方政府相继出手救市后 本月下旬楼市宽松政策料陆续出台
update:2021-10-13
面对日益加剧的楼市“灰犀牛”风险,中国央行货币政策委员会上月底召开季度例会时,罕见地针对楼市提出“两个维护”:维护房地产市场的健康发展,维护住房消费者的合法权益。这被市场解读为楼市调控即将见底的前兆。

本周又有消息称,中国房地产业协会周五(15日)将召集部分房企在北京开座谈会,摸底近期市场情绪和房企面对的困难。财联社引述业内人士说法称,与会人员级别在副总裁以上,“预计这个会议将具有风向标意义”。

严跃进研判,哈尔滨出台救市政策后,更多城市可能会跟进,令第四季成为房地产政策的拐点季。国家对房企将从“加大约束”转为“加大支持”,对楼市调控重点从“防范金融泡沫”转为“防范债务风险”。他预计各类宽松政策将从本月下旬起陆续出现,缓解企业在销售、投资和经营拿地等问题上面对的阻力。

业者:遵循“三稳”方向 不让楼市再回高烧状态
黄韬也认为政府会针对当前市场情况,适当放宽调控。但他强调,这类调控还是在“房住不炒”的框架下,遵循“稳地价、稳房价、稳预期”的“三稳”方向,不会让楼市再回到此前的高烧状态。

他说:“政府出面救市,不单是要稳定市场,也要稳定社会。
Referenced from:https://www.zaobao.com/finance/china/story20211013-1202763

include "event2/thread.h"

libevent 多线程发送数据 bufferevent_write
update:2021-10-14
需要增加:

ifdef WIN32

evthread_use_windows_threads();

else

evthread_use_pthreads();

endif

evthread_make_base_notifiable(base);
struct bufferevent*bev = bufferevent_socket_new(base, -1,
    BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE );

增加 BEV_OPT_THREADSAFE 可能会更 可靠。