当前位置: 首页 > 面试题库 >

Linux中使用条件变量执行Windows事件?

祖迪
2023-03-14
问题内容

我正在尝试在Linux中实现非常简单的Windows事件。仅针对我的情况-3个线程,1个主线程和2个辅助线程。每个辅助线程通过SetEvent引发1个事件,主线程等待它。例:

int main()
{
    void* Events[2];
    Events[0] = CreateEvent();
    Events[1] = CreateEvent();

    pthread_start(Thread, Events[0]);
    pthread_start(Thread, Events[1]);

    WaitForMultipleObjects(2, Events, 30000) // 30 seconds timeout

    return 0;
}

int* thread(void* Event)
{
    // Do something
    SetEvent(Event);
    // Do something
}

因此,要实现它,我使用条件变量。但是我的问题是-这是正确的方法吗?还是我做错了什么?我的实现:

// Actually, this function return pointer to struct with mutex and cond
// here i just simplified example
void* CreateEvent(mutex, condition)
{
    pthread_mutex_init(mutex, NULL);
    pthread_cond_init(condition, NULL);
}

bool SetEvent (mutex, condition)
{
    pthread_mutex_lock(mutex);
    pthread_cond_signal(condition);
    pthread_mutex_unlock(mutex);
}

int WaitForSingleObject(mutex, condition, timeout)
{
    pthread_mutex_lock(mutex);
    pthread_cond_timedwait(condition, mutex, timeout);
    pthread_mutex_unlock(mutex);
}

// Call WaitForSingleObject for each event. 
// Yes, i know, that its a wrong way, but it should work in my example.
int WaitForMultipleObjects(count, mutex[], condition[], timeout);

一切似乎都很好,但是我认为,当我在辅助线程中的SetEvent被调用之前,在主线程中调用WaitFor
..函数时,将出现该问题。在Windows中,它运作良好,但在Linux中,上面仅描述了想法。

也许您告诉我解决这个问题的更好方法?谢谢。

UPD: 超时非常重要,因为辅助线程之一可能无法传递SetEvent()。


问题答案:

已经有关于stackoverflow的类似问题:Linux中的WaitForSingleObject和WaitForMultipleObjects等效项

另外,您可以使用信号量:

sem_t semOne  ;
sem_t semTwo  ;
sem_t semMain ;

在主线程中:

sem_init(semOne,0,0) ;
sem_init(semTwo,0,0) ;
sem_init(semMain,0,0) ;

...


sem_wait(&semMain);

// Thread 1
sem_wait(&semOne);
sem_post(&semMain);


// Thread 2
sem_wait(&semTwo);
sem_post(&semMain);

可以在这里找到详细的描述和各种示例:------
http://www.ibm.com/developerworks/linux/library/l-ipc2lin3/index.html

以前的链接不再可用。Internet存档的Wayback
Machine上的最新存档版本是:https
://web.archive.org/web/20130515223326/http:
//www.ibm.com/developerworks/linux/library/l-ipc2lin3/index.html



 类似资料:
  • 本文向大家介绍浅谈Linux条件变量的使用,包括了浅谈Linux条件变量的使用的使用技巧和注意事项,需要的朋友参考一下 Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费者算法的同步机制,允许线程以无竞争的方式等待特定条件的发生。 示例伪代码: 条件变量需要配合互斥量一起使用,互斥量作为参数传入wait函数,函数把调用线程放到等待条件的线程列表上,然后对互斥量解锁,

  • 条件变量 条件变量(conditional variable)的常见接口是这样的: wait:当前线程开始等待这个条件变量 notify_one:让某一个等待此条件变量的线程继续运行 notify_all:让所有等待此变量的线程继续运行 条件变量和互斥锁的区别在于,互斥锁解铃还须系铃人,但条件变量可以由任何来源发出 notify 信号。同时,互斥锁的一次 lock 一定对应一次 unlock,但条

  • 问题内容: pthread问题: 似乎只有在其他线程调用pthread_cond_notify之前调用pthread_cond_wait时,条件变量才起作用。如果在等待之前以某种方式发生通知,则等待将卡住。 我的问题是: 什么时候应该使用条件变量? 调度程序可以抢占线程,并且在等待之前可能会发生通知。 等待信号量没有这个问题-它们有一个计数器。 什么时候条件变量比信号量更好? 这是一个测试: 文件

  • null null null 所以现在,如果我想把一个应用程序部署到舞台上,我可以简单地运行这个playbook命令: 例如,我将staging/group_vars/webserver中的app1目录的路径定义为“/var/www/staging.app1.com”。但是我也需要为app2部署到相同的服务器上,但是目录不同。是否可以在group_vars中使用条件变量? 所以如果我跑: 敬请指教

  • 问题内容: 使用in 时可以执行更新吗?例如: 问题答案: 有一个非常强大的功能,称为: [15.4。DML风格的操作](http://docs.jboss.org/hibernate/orm/4.3/manual/en- US/html/ch15.html#batch-direct) 来自doc的小引用: …但是,Hibernate提供了通过Hibernate查询语言执行批量SQL样式DML语句

  • 为了写出更实用的程序,我们几乎总是需要检查特定条件,并相应地改变程序的行为。条件语句给了我们这种能力。最简单的形式是if语句: if( x > 0){ cout << "x is positive" <<endl; } 圆括号中的表达式被称为条件。如果条件为真,则花括号中的语句会被执行。否则不执行。 条件可以包括任何比较操作符: x == y //x等于y x !=