在C++程序中添加逻辑流程控制
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-30
map_next = pVF->map_next; if (pVF->map_next) pVF->map_next->map_prev = pVF->map_prev; } #ifdef WIN32 CloseHandle(pVF->evt); #else pthread_cond_destroy(&pVF->cond); #endif free(pVF); return NULL; } if (pVF->map_next == NULL) break; pVF = pVF->map_next; } if (!bCreate) return NULL; pVF2 = (VIRTUAL_FLOW*)malloc(sizeof(VIRTUAL_FLOW)); pVF2->map_prev = pVF; pVF2->map_next = pVF2->evt_next = NULL; pVF->map_next = pVF2; pVF = pVF2; } pVF->thread_id = thread_id; #ifdef WIN32 pVF->evt = CreateEvent(NULL, FALSE, FALSE, NULL); #else pthread_cond_init(&pVF->cond, NULL); pthread_mutex_init(&pVF->mut, NULL); #endif pVF->status = 0; return pVF; } void vf_flow_wait(VIRTUAL_FLOW* vf) { #ifdef WIN32 WaitForSingleObject(vf->evt, INFINITE); #else pthread_cond_wait(&vf->cond, &vf->mut); pthread_mutex_unlock(&vf->mut); #endif if (vf->status > 0) { vf_exit(); #ifdef WIN32 ExitThread(0); #else pthread_exit(NULL); #endif } } void vf_flow_activate(VIRTUAL_FLOW* vf) { #ifdef WIN32 SetEvent(vf->evt); #else pthread_mutex_lock(&vf->mut); pthread_cond_signal(&vf->cond); pthread_mutex_unlock(&vf->mut); #endif } #ifdef WIN32 DWORD WINAPI #else void* #endif vf_flow_routine(void* param) { VIRTUAL_FLOW* parent_vf = (VIRTUAL_FLOW*)param; VIRTUAL_FLOW* vf = get_my_vf(1); vf->evt_next = parent_vf; parent_vf->routine(parent_vf->param); vf_exit(); #ifdef WIN32 return 0; #else return NULL; #endif } void vf_init() { if (g_vf_init) return; memset(g_vf_map, 0, sizeof(g_vf_map)); g_vf_init = 1; } void vf_start(LPVFLOW_START_ROUTINE routine, void* param) { VIRTUAL_FLOW* vf; #ifndef WIN32 pthread_t thread; #endif vf_init(); vf = get_my_vf(1); vf->routine = routine; vf->param = param; #ifdef WIN32 CreateThread(NULL, 0, vf_flow_routine, vf, 0, NULL); #else pthread_mutex_lock(&vf->mut); pthread_create(&thread, NULL, vf_flow_routine, vf); #endif vf_flow_wait(vf); } void vf_wait(VIRTUAL_FLOW_EVENT* evt) { VIRTUAL_FLOW* vf, *vf_next; vf_init(); vf = get_my_vf(1); if (evt->first == NULL) evt->first = evt->last = vf; else { evt->last->evt_next = vf; evt->last = vf; } #ifndef WIN32 pthread_mutex_lock(&vf->mut); #endif vf_next = vf->evt_next; if (vf_next) { vf->evt_next = NULL; vf_flow_activate(vf_next); } vf_flow_wait(vf); } void vf_signal(VIRTUAL_FLOW_EVENT* evt) { VIRTUAL_FLOW* vf, *vf_first; vf_init(); if (!(vf_first = evt->first)) return; vf = get_my_vf(1); #ifndef WIN32 pthread_mutex_lock(&vf->mut); #endif evt->last->evt_next = vf; evt->first = evt->last = NULL; vf_flow_activate(vf_first); vf_flow_wait(vf); } void vf_terminate(VIRTUAL_FLOW_EVENT* evt) { VIRTUAL_FLOW* vf, *vf_first; vf_init(); for (vf = evt->first; vf; vf = vf->evt_next) vf->status = 1; vf_first = evt->first; evt->first = evt->last = NULL; if (vf_first) vf_flow_activate(vf_first); } |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 一步一步实现MFC扩展DLL中导出类和对话框下一篇: volatile关键字的说明以及测试
关于在C++程序中添加逻辑流程控制的所有评论