线程和fork

    xiaoxiao2022-07-13  159

    #include <unistd.h> #include <pthread.h> #include <stdio.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* thread_fun(void* arg) { sleep(1); pid_t pid; pid = fork(); if (pid == 0) { pthread_mutex_lock(&mutex); printf("child\n"); pthread_mutex_unlock(&mutex); } if (pid > 0) { pthread_mutex_lock(&mutex); printf("parent\n"); pthread_mutex_unlock(&mutex); } } int main() { pthread_t tid; if (pthread_create(&tid, NULL, thread_fun, NULL)) { printf("create new thread failed\n"); return; } pthread_mutex_lock(&mutex); sleep(2); pthread_mutex_unlock(&mutex); printf("main\n"); pthread_join(tid, NULL); return; }

    输出结果:

     

    #include <unistd.h> #include <pthread.h> #include <stdio.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* thread_fun(void* arg) { sleep(1); printf("new thread\n"); pid_t pid; pthread_mutex_lock(&mutex); pid = fork(); if (pid == 0) { pthread_mutex_unlock(&mutex); printf("child\n"); } if (pid > 0) { pthread_mutex_unlock(&mutex); printf("parent\n"); } } int main() { pthread_t tid; if (pthread_create(&tid, NULL, thread_fun, NULL)) { printf("create new thread failed\n"); return; } printf("main\n"); pthread_join(tid, NULL); return; }

     

    /* 1. prepare 在调用fork之前会被调用 2. parent 在fork返回之前被调用 3. child 在fork返回子进程之前被调用 */ #include <unistd.h> #include <pthread.h> #include <stdio.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void prepare() { pthread_mutex_lock(&mutex); printf("I'm prepare\n"); } void parent() { pthread_mutex_unlock(&mutex); printf("I'm parent\n"); } void child() { pthread_mutex_unlock(&mutex); printf("I'm child\n"); } void* thread_fun(void* arg) { sleep(1); pid_t pid; pthread_atfork(prepare, parent, child); pid = fork(); if (pid == 0) { pthread_mutex_lock(&mutex); printf("child\n"); pthread_mutex_unlock(&mutex); } if (pid > 0) { pthread_mutex_lock(&mutex); printf("parent\n"); pthread_mutex_unlock(&mutex); } } int main() { pthread_t tid; if (pthread_create(&tid, NULL, thread_fun, NULL)) { printf("create new thread failed\n"); return; } pthread_mutex_lock(&mutex); sleep(2); printf("main\n"); pthread_mutex_unlock(&mutex); pthread_join(tid, NULL); return; }

    最新回复(0)