简体   繁体   English

如何让子线程等待主线程

[英]How to make a child thread waiting for the main thread

I've got 2 threads : one child which detects mouse events, and the other main one which execute the program.我有 2 个线程:一个子线程检测鼠标事件,另一个主线程执行程序。

global variable :全局变量:

int g_wait = 0; 

child thread :子线程:

void *mouseEvent2(void *arg) 
{
int fd;
struct input_event ev;
const char* pFile = "/dev/input/event0";

signal(SIGINT, SAMPLE_VGS_HandleSig);
signal(SIGTERM, SAMPLE_VGS_HandleSig);

fd = open(pFile, O_RDONLY);
if (fd == -1) {
    printf("ERROR Opening %s\n", pFile);
    return NULL;
}

while(scroll != -1) {
    read(fd, &ev, sizeof(ev));

    [... Some code with if statement ... ]
    if(...) //left mouse button
        g_wait = !g_wait;

    [need waiting so the thread won't use at 100% a core]
}
close(fd);
(void) arg;
pthread_exit(NULL);
}

Main thread :主线程:

int main() {
[... some code and initilisation here ...]
if(pthread_create(&scrollThread, NULL, mouseEvent2, NULL))
    goto _FAILURE_;
do {
    [...]
    while(g_wait);
}
[... some deinit ...]
_FAILURE_ :
pthread_join(scrollThread, NULL);
[... some other deinit ...]
return 0;
}

My problem is : when my main is waiting, my child thread is using at 100% 1 core processor, so which function can I use to pause the child thread with the main one?我的问题是:当我的主线程在等待时,我的子线程正在使用 100% 1 个核心处理器,那么我可以使用哪个函数来暂停主线程的子线程?

I already consult How to make main thread wait for all child threads finish?我已经咨询了如何让主线程等待所有子线程完成? but it didn't help me totally.但它并没有完全帮助我。

So, if you want to pause main thread until child thread signals about it ends, you can use mutexes to lock main thread:所以,如果你想暂停主线程直到子线程结束,你可以使用互斥锁来锁定主线程:

#include "stdio.h"
#include "pthread.h"

/* I work on windows now, so i need windows sleep function to test example */
/* platform independed sleep function */
#ifdef _WIN32
# include "windows.h"
# define platform_sleep(ms) Sleep(ms)
#else
# include "unistd.h"
# define platform_sleep(s) sleep(s / 1000)
#endif


pthread_mutex_t mtx;


void *
child_func(void *arg)
{
    /* simulate some hard work */
    platform_sleep(3000); /* 3 secs */

    /* after this "hard work" we allow main thread to continue */
    pthread_mutex_unlock(&mtx);
}



int
main()
{
    pthread_mutex_init(&mtx, NULL);
    pthread_mutex_lock(&mtx);

    pthread_t child;
    pthread_create(&child, NULL, child_func, NULL);

    /* mutex is already locked by main thread, so it waits */
    /* until child thread unlock it */
    pthread_mutex_lock(&mtx);
    pthread_mutex_destroy(&mtx);

    /* do work after child ends */
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM