#include #include #include #include int main(int argc, char *argv); static int child_thread(void *data); static sig_atomic_t counter; static pthread_mutex_t clone_mutex; int main(int argc, char *argv) { char *stack[4]; pid_t child[4]; int status; pthread_mutex_init(&clone_mutex, NULL); stack[0] = malloc(4096); stack[1] = malloc(4096); stack[2] = malloc(4096); stack[3] = malloc(4096); child[0] = clone(child_thread, &stack[0][4096], CLONE_VM, NULL); child[1] = clone(child_thread, &stack[1][4096], CLONE_VM, NULL); child[2] = clone(child_thread, &stack[2][4096], CLONE_VM, NULL); child[3] = clone(child_thread, &stack[3][4096], CLONE_VM, NULL); waitpid(child[0], &status, 0); waitpid(child[1], &status, 0); waitpid(child[2], &status, 0); waitpid(child[3], &status, 0); pthread_mutex_destroy(&clone_mutex); printf("%d\n", counter); exit(0); return 0; } static int child_thread(void *data) { pthread_mutex_lock(&clone_mutex); ++counter; pthread_mutex_unlock(&clone_mutex); return 0; }