dac*_*cwe 6 linux windows events pthreads windows-ce
我正在使用arm imx27板在Windows CE和Linux之间进行性能评估.代码已经为CE编写并测量了执行不同内核调用所需的时间,例如使用OS原语(如互斥锁和信号量),打开和关闭文件以及联网.
在我将这个应用程序移植到Linux(pthreads)期间,我偶然发现了一个我无法解释的问题.几乎所有测试都显示性能提高了5到10倍,但不是我的win32事件版本(SetEvent和WaitForSingleObject),CE实际上"赢了"这个测试.
为了模仿我使用pthreads条件变量的行为(我知道我的实现并没有完全模拟CE版本,但它足以进行评估).
测试代码使用两个使用事件相互"乒乓"的线程.
线程1 :(我测量的线程)
HANDLE hEvt1, hEvt2;
hEvt1 = CreateEvent(NULL, FALSE, FALSE, TEXT("MyLocEvt1"));
hEvt2 = CreateEvent(NULL, FALSE, FALSE, TEXT("MyLocEvt2"));
ResetEvent(hEvt1);
ResetEvent(hEvt2);
for (i = 0; i < 10000; i++)
{
SetEvent (hEvt1);
WaitForSingleObject(hEvt2, INFINITE);
}
Run Code Online (Sandbox Code Playgroud)
线程2 :(只是"回应")
while (1)
{
WaitForSingleObject(hEvt1, INFINITE);
SetEvent(hEvt2);
}
Run Code Online (Sandbox Code Playgroud)
线程1 :(我测量的线程)
struct event_flag *event1, *event2;
event1 = eventflag_create();
event2 = eventflag_create();
for (i = 0; i < 10000; i++)
{
eventflag_set(event1);
eventflag_wait(event2);
}
Run Code Online (Sandbox Code Playgroud)
线程2 :(只是"回应")
while (1)
{
eventflag_wait(event1);
eventflag_set(event2);
}
Run Code Online (Sandbox Code Playgroud)
我的实施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);
}
Run Code Online (Sandbox Code Playgroud)
而且struct:
struct event_flag
{
pthread_mutex_t mutex;
pthread_cond_t condition;
unsigned int flag;
};
Run Code Online (Sandbox Code Playgroud)
请注意,调用时不需要持有互斥体pthread_cond_signal(),因此您可以通过在发出条件信号之前释放互斥体来提高条件变量“事件”实现的性能:
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);
}
Run Code Online (Sandbox Code Playgroud)
这可能会阻止唤醒的线程立即阻塞互斥锁。
| 归档时间: |
|
| 查看次数: |
8962 次 |
| 最近记录: |