Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了pthread条件变量vs win32事件(linux vs windows-ce)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在使用arm imx27板在Windows CE和Linux之间进行性能评估.代码已经为CE编写并测量了执行不同内核调用所需的时间,例如使用OS原语(如互斥锁和信号量),打开和关闭文件以及联网.在我将这个应用程序移植到Linux(pthreads)期间,我偶然发现了一个我无法解释的问题.几乎所有测试都显示性能从5到10倍增加,但不是我的版本win32 e

我正在使用arm imx27板在Windows CE和Linux之间进行性能评估.代码已经为CE编写并测量了执行不同内核调用所需的时间,例如使用OS原语(如互斥锁和信号量),打开和关闭文件以及联网.

在我将这个应用程序移植到Linux(pthreads)期间,我偶然发现了一个我无法解释的问题.几乎所有测试都显示性能从5到10倍增加,但不是我的版本win32 events(SetEventWaitForSingleObject),CE实际上“赢了”这个测试.

为了模仿我使用pthreads条件变量的行为(我知道我的实现并没有完全模拟CE版本,但它足以进行评估).

测试代码使用两个使用事件相互“乒乓”的线程.

Windows代码

线程1 :(我测量的线程)

HANDLE hEvt1,hEvt2;
hEvt1 = CreateEvent(NULL,FALSE,TEXT("MyLocEvt1"));
hEvt2 = CreateEvent(NULL,TEXT("MyLocEvt2"));

ResetEvent(hEvt1);
ResetEvent(hEvt2);

for (i = 0; i < 10000;="" i++)="" {="" setevent="" (hevt1);="" waitforsingleobject(hevt2,infinite);="" }="">

线程2 :(只是“回应”)

while (1)
{
    WaitForSingleObject(hEvt1,INFINITE);
    SetEvent(hEvt2);
}

Linux代码

线程1 :(我测量的线程)

struct event_flag *event1,*event2;
event1 = eventflag_create();
event2 = eventflag_create();

for (i = 0; i < 10000;="" i++)="" {="" eventflag_set(event1);="" eventflag_wait(event2);="" }="">

线程2 :(只是“回应”)

while (1)
{
    eventflag_wait(event1);
    eventflag_set(event2);
}

我对eventflag_ *的实现:

struct event_flag* eventflag_create()
{
    struct event_flag* ev;
    ev = (struct event_flag*) malloc(sizeof(struct event_flag));

    pthread_mutex_init(&ev->mutex,NULL);
    pthread_cond_init(&ev->condition,NULL);
    ev->flag = 0;

    return ev;
}

void eventflag_wait(struct event_flag* ev)
{
    pthread_mutex_lock(&ev->mutex);

    while (!ev->flag)
        pthread_cond_wait(&ev->condition,&ev->mutex);

    ev->flag = 0;

    pthread_mutex_unlock(&ev->mutex);
}

void eventflag_set(struct event_flag* ev)
{
    pthread_mutex_lock(&ev->mutex);

    ev->flag = 1;
    pthread_cond_signal(&ev->condition);

    pthread_mutex_unlock(&ev->mutex);
}

结构:

struct event_flag
{
    pthread_mutex_t mutex;
    pthread_cond_t  condition;
    unsigned int    flag;
};

问题:

>为什么我看不到这里的性能提升?
>可以采取哪些措施来提高性能(例如,有更快的方法来实现CE行为)?
>我不习惯编写pthreads,我的实现中是否存在错误可能会导致性能下降?
>有没有替代图书馆?

最佳答案
请注意,在调用pthread_cond_signal()时不需要持有互斥锁,因此您可以通过在发出条件信号之前释放互斥锁来提高条件变量“event”实现的性能

void eventflag_set(struct event_flag* ev)
{
    pthread_mutex_lock(&ev->mutex);

    ev->flag = 1;

    pthread_mutex_unlock(&ev->mutex);

    pthread_cond_signal(&ev->condition);
}

这可能会阻止唤醒的线程立即阻塞互斥锁.

大佬总结

以上是大佬教程为你收集整理的pthread条件变量vs win32事件(linux vs windows-ce)全部内容,希望文章能够帮你解决pthread条件变量vs win32事件(linux vs windows-ce)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: