⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cvar2.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 3 页
字号:
CondVarTestPUU(void *_arg){    PRInt32 arg = (PRInt32)_arg;    PRInt32 index, loops;    threadinfo *list;    PRLock *sharedlock;    PRCondVar *sharedcvar;    PRLock *exitlock;    PRCondVar *exitcvar;    PRInt32 *tcount, *saved_tcount;    exitcount=0;    list = (threadinfo *)PR_MALLOC(sizeof(threadinfo) * (arg * 4));    saved_tcount = tcount = (PRInt32 *)PR_CALLOC(sizeof(*tcount) * (arg * 4));    sharedlock = PR_NewLock();    sharedcvar = PR_NewCondVar(sharedlock);    exitlock = PR_NewLock();    exitcvar = PR_NewCondVar(exitlock);    /* Create the threads */    for(index=0; index<arg; ) {        list[index].lock = PR_NewLock();        list[index].cvar = PR_NewCondVar(list[index].lock);        CreateTestThread(&list[index],                         index,                         list[index].lock,                         list[index].cvar,                         count,                         PR_INTERVAL_NO_TIMEOUT,                         tcount,                         exitlock,                         exitcvar,                         &exitcount,                         PR_FALSE,                         PR_LOCAL_THREAD);	DPRINTF(("CondVarTestPUU: created thread 0x%lx\n",list[index].thread));        index++;	tcount++;    }    for (loops = 0; loops < count; loops++) {        /* Notify the threads */        for(index=0; index<(arg); index++) {            PR_Lock(list[index].lock);            (*list[index].tcount)++;            PR_NotifyCondVar(list[index].cvar);            PR_Unlock(list[index].lock);        }	PR_Lock(exitlock);        /* Wait for threads to finish */        while(exitcount < arg) {DPRINTF(("CondVarTestPUU: thread 0x%lx waiting on exitcvar = 0x%lx cnt = %ld\n",				PR_GetCurrentThread(), exitcvar, exitcount));            	PR_WaitCondVar(exitcvar, PR_SecondsToInterval(60));	}        PR_ASSERT(exitcount >= arg);        exitcount -= arg;        PR_Unlock(exitlock);    }    /* Join all the threads */    for(index=0; index<(arg); index++)  {	DPRINTF(("CondVarTestPUU: joining thread 0x%lx\n",list[index].thread));        PR_JoinThread(list[index].thread);        if (list[index].internal) {            PR_Lock(list[index].lock);            PR_DestroyCondVar(list[index].cvar);            PR_Unlock(list[index].lock);            PR_DestroyLock(list[index].lock);        }    }    PR_DestroyCondVar(sharedcvar);    PR_DestroyLock(sharedlock);    PR_DestroyCondVar(exitcvar);    PR_DestroyLock(exitlock);    PR_DELETE(list);    PR_DELETE(saved_tcount);}void CondVarTestPUK(void *_arg){    PRInt32 arg = (PRInt32)_arg;    PRInt32 index, loops;    threadinfo *list;    PRLock *sharedlock;    PRCondVar *sharedcvar;    PRLock *exitlock;    PRCondVar *exitcvar;    PRInt32 *tcount, *saved_tcount;    exitcount=0;    list = (threadinfo *)PR_MALLOC(sizeof(threadinfo) * (arg * 4));    saved_tcount = tcount = (PRInt32 *)PR_CALLOC(sizeof(*tcount) * (arg * 4));    sharedlock = PR_NewLock();    sharedcvar = PR_NewCondVar(sharedlock);    exitlock = PR_NewLock();    exitcvar = PR_NewCondVar(exitlock);    /* Create the threads */    for(index=0; index<arg; ) {        list[index].lock = PR_NewLock();        list[index].cvar = PR_NewCondVar(list[index].lock);        CreateTestThread(&list[index],                         index,                         list[index].lock,                         list[index].cvar,                         count,                         PR_INTERVAL_NO_TIMEOUT,                         tcount,                         exitlock,                         exitcvar,                         &exitcount,                         PR_FALSE,                         PR_GLOBAL_THREAD);        index++;        tcount++;    }    for (loops = 0; loops < count; loops++) {        /* Notify the threads */        for(index=0; index<(arg); index++) {            PR_Lock(list[index].lock);            (*list[index].tcount)++;            PR_NotifyCondVar(list[index].cvar);            PR_Unlock(list[index].lock);        }        /* Wait for threads to finish */        PR_Lock(exitlock);        while(exitcount < arg)            PR_WaitCondVar(exitcvar, PR_SecondsToInterval(60));        PR_ASSERT(exitcount >= arg);        exitcount -= arg;        PR_Unlock(exitlock);    }    /* Join all the threads */    for(index=0; index<(arg); index++) {        PR_JoinThread(list[index].thread);        if (list[index].internal) {            PR_Lock(list[index].lock);            PR_DestroyCondVar(list[index].cvar);            PR_Unlock(list[index].lock);            PR_DestroyLock(list[index].lock);        }    }    PR_DestroyCondVar(sharedcvar);    PR_DestroyLock(sharedlock);    PR_DestroyCondVar(exitcvar);    PR_DestroyLock(exitlock);    PR_DELETE(list);    PR_DELETE(saved_tcount);}void CondVarTest(void *_arg){    PRInt32 arg = (PRInt32)_arg;    PRInt32 index, loops;    threadinfo *list;    PRLock *sharedlock;    PRCondVar *sharedcvar;    PRLock *exitlock;    PRCondVar *exitcvar;    PRInt32 *ptcount, *saved_ptcount;    exitcount=0;    tcount=0;    list = (threadinfo *)PR_MALLOC(sizeof(threadinfo) * (arg * 4));    saved_ptcount = ptcount = (PRInt32 *)PR_CALLOC(sizeof(*ptcount) * (arg * 4));    sharedlock = PR_NewLock();    sharedcvar = PR_NewCondVar(sharedlock);    exitlock = PR_NewLock();    exitcvar = PR_NewCondVar(exitlock);    /* Create the threads */    for(index=0; index<arg*4; ) {        CreateTestThread(&list[index],                         index,                         sharedlock,                         sharedcvar,                         count,                         PR_INTERVAL_NO_TIMEOUT,                         &tcount,                         exitlock,                         exitcvar,                         &exitcount,                         PR_TRUE,                         PR_LOCAL_THREAD);        index++;        CreateTestThread(&list[index],                         index,                         sharedlock,                         sharedcvar,                         count,                         PR_INTERVAL_NO_TIMEOUT,                         &tcount,                         exitlock,                         exitcvar,                         &exitcount,                         PR_TRUE,                         PR_GLOBAL_THREAD);        index++;        list[index].lock = PR_NewLock();        list[index].cvar = PR_NewCondVar(list[index].lock);        CreateTestThread(&list[index],                         index,                         list[index].lock,                         list[index].cvar,                         count,                         PR_INTERVAL_NO_TIMEOUT,                         ptcount,                         exitlock,                         exitcvar,                         &exitcount,                         PR_FALSE,                         PR_LOCAL_THREAD);        index++;	ptcount++;        list[index].lock = PR_NewLock();        list[index].cvar = PR_NewCondVar(list[index].lock);        CreateTestThread(&list[index],                         index,                         list[index].lock,                         list[index].cvar,                         count,                         PR_INTERVAL_NO_TIMEOUT,                         ptcount,                         exitlock,                         exitcvar,                         &exitcount,                         PR_FALSE,                         PR_GLOBAL_THREAD);        index++;	ptcount++;    }    for (loops = 0; loops < count; loops++) {        /* Notify the threads */        for(index=0; index<(arg*4); index++) {            PR_Lock(list[index].lock);            (*list[index].tcount)++;            PR_NotifyCondVar(list[index].cvar);            PR_Unlock(list[index].lock);        }#if 0        printf("wait for threads done\n");#endif        /* Wait for threads to finish */        PR_Lock(exitlock);        while(exitcount < arg*4)            PR_WaitCondVar(exitcvar, PR_SecondsToInterval(60));        PR_ASSERT(exitcount >= arg*4);        exitcount -= arg*4;        PR_Unlock(exitlock);#if 0        printf("threads ready\n");#endif    }    /* Join all the threads */    for(index=0; index<(arg*4); index++) {        PR_JoinThread(list[index].thread);        if (list[index].internal) {            PR_Lock(list[index].lock);            PR_DestroyCondVar(list[index].cvar);            PR_Unlock(list[index].lock);            PR_DestroyLock(list[index].lock);        }    }    PR_DestroyCondVar(sharedcvar);    PR_DestroyLock(sharedlock);    PR_DestroyCondVar(exitcvar);    PR_DestroyLock(exitlock);    PR_DELETE(list);    PR_DELETE(saved_ptcount);}void CondVarTimeoutTest(void *_arg){    PRInt32 arg = (PRInt32)_arg;    PRInt32 index, loops;    threadinfo *list;    PRLock *sharedlock;    PRCondVar *sharedcvar;    PRLock *exitlock;    PRCondVar *exitcvar;    list = (threadinfo *)PR_MALLOC(sizeof(threadinfo) * (arg * 4));    sharedlock = PR_NewLock();    sharedcvar = PR_NewCondVar(sharedlock);    exitlock = PR_NewLock();    exitcvar = PR_NewCondVar(exitlock);    /* Create the threads */    for(index=0; index<arg*4; ) {        CreateTestThread(&list[index],                         index,                         sharedlock,                         sharedcvar,                         count,                         PR_MillisecondsToInterval(50),                         &tcount,                         exitlock,                         exitcvar,                         &exitcount,                         PR_TRUE,                         PR_LOCAL_THREAD);        index++;        CreateTestThread(&list[index],                         index,                         sharedlock,                         sharedcvar,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -