User Tools

Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

c:thread-pool-wh [2019-05-13 16:29]
ziggi
c:thread-pool-wh [2020-02-15 00:57]
Line 1: Line 1:
-=====Thread pool sample with runtime signal handler===== 
- 
-<code C thread-pool2.c>​ 
-/* 
- * Copyright 2019 Oleg Borodin ​ <​borodin@unix7.org>​ 
- */ 
- 
-#include <​stdio.h>​ 
-#include <​stdlib.h>​ 
-#include <​pthread.h>​ 
-#include <​unistd.h>​ 
-#include <​string.h>​ 
-#include <​signal.h>​ 
- 
-int queue = 0; 
-pthread_mutex_t qmutex; 
- 
-pthread_cond_t cond; 
-pthread_mutex_t mutex; 
- 
-void qpush() { 
-    pthread_mutex_lock(&​qmutex);​ 
-    queue++; 
-    pthread_mutex_unlock(&​qmutex);​ 
-    pthread_cond_signal(&​cond);​ 
-} 
-void qpop() { 
-    pthread_mutex_lock(&​qmutex);​ 
-    queue--; 
-    pthread_mutex_unlock(&​qmutex);​ 
-} 
-int qsize() { 
-    pthread_mutex_lock(&​qmutex);​ 
-    int tmp = queue; 
-    pthread_mutex_unlock(&​qmutex);​ 
-    return tmp; 
-} 
- 
-void sighandler(int signo) { 
-    fprintf(stderr,​ "have signal, thread id %d, exit\n",​ (int)pthread_self());​ 
-    pthread_exit(NULL);​ 
-} 
- 
-void* handler(void* ptr) { 
-    struct sigaction act; 
-    memset(&​act,​ 0, sizeof(act));​ 
- 
-    sigset_t mask; 
-    sigemptyset(&​mask);​ 
-    sigaddset(&​mask,​ SIGRTMIN); 
- 
-    act.sa_handler = sighandler; 
-    act.sa_mask = mask; 
-    sigaction(SIGRTMIN,​ &act, NULL); 
- 
-    while (1) { 
-        while(qsize() == 0) { 
-            pthread_cond_wait(&​cond,​ &​mutex);​ 
-        } 
-        if (qsize() > 0) qpop(); 
-        pthread_mutex_unlock(&​mutex);​ 
-        printf("​worker %d\n", (int)pthread_self());​ 
-    } 
-    return NULL; 
-} 
- 
-int main(int argc, char **argv) { 
-    const int poolsize = 5; 
-    pthread_t threads[poolsize];​ 
-    for (int i = 0; i < poolsize; i++) { 
-        pthread_create(&​threads[i],​ NULL, handler, NULL); 
-    } 
-    for (int i = 0; i < poolsize; i++) { 
-        pthread_detach(threads[i]);​ 
-        printf("​thread create id = %d\n", (int)threads[i]);​ 
-    } 
- 
-    for (int i = 0; i < 12; i++) { 
-        qpush(); 
-    } 
- 
-    pthread_kill(threads[0],​ SIGRTMIN); 
-    pthread_kill(threads[1],​ SIGRTMIN); 
-    pthread_kill(threads[2],​ SIGRTMIN); 
- 
-    sleep(1); 
- 
-    for (int i = 0; i < 12; i++) { 
-        qpush(); 
-    } 
- 
-    sleep(1); 
-    return 0; 
-} 
-</​code>​ 
- 
-<​file>​ 
-$ "​./​pthread01"​ 
-thread create id = 16868608 
-thread create id = 16869888 
-thread create id = 16871168 
-thread create id = 16872448 
-thread create id = 16873728 
-have signal, thread id 16871168, exit 
-have signal, thread id 16868608, exit 
-have signal, thread id 16869888, exit 
-worker 16872448 
-worker 16872448 
-worker 16872448 
-worker 16872448 
-worker 16873728 
-worker 16873728 
-worker 16873728 
-worker 16873728 
-worker 16873728 
-worker 16873728 
-worker 16873728 
-worker 16872448 
-</​file>​ 
----- 
-[<>]