我正在使用arm imx27板在Windows CE和Linux之间进行性能评估.代码已经为CE编写并测量了执行不同内核调用所需的时间,例如使用OS原语(如互斥锁和信号量),打开和关闭文件以及联网.
在我将这个应用程序移植到linux(pthreads)期间,我偶然发现了一个我无法解释的问题.几乎所有测试都显示性能从5到10倍增加,但不是我的版本win32 events(SetEvent
和WaitForSingleObject
),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)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)