2线程在Linux中并行

我刚开始实现线程。 我想要创build1个主线程和2个并行线程。 这是我的代码:

#include <stdio.h> #include <pthread.h> #include <glib.h> #include <time.h> #define THREAD1 1 #define THREAD2 2 GMainLoop *loop1; GMainLoop *loop2; pthread_t pth1; // this is our thread identifier pthread_t pth2; // this is our thread identifier gboolean timeout_callback1(gpointer data){ clock_t start = clock(); int msec = start * 1000 / CLOCKS_PER_SEC; printf("timeout_callback ==== 1 at %d seconds %d milliseconds\n", msec/1000, msec%1000); } gboolean timeout_callback2(gpointer data){ sleep(2); clock_t start = clock(); int msec = start * 1000 / CLOCKS_PER_SEC; printf("timeout_callback ==== 2 at %d seconds %d milliseconds\n", msec/1000, msec%1000); } /* This is our thread function. It is like main(), but for a thread */ void *threadFunc(void *arg) { int *index; int i = 0; index=(int*)arg; if (index == THREAD1){ printf("threadFunc: %d\n", index); loop1 = g_main_loop_new ( NULL , FALSE ); //add source to default context g_timeout_add (100 , timeout_callback1 , loop1); g_main_loop_run (loop1); g_main_loop_unref(loop1); } else { if (index == THREAD2){ printf("threadFunc: %d\n", index); loop2 = g_main_loop_new ( NULL , FALSE ); //add source to default context g_timeout_add (100 , timeout_callback2 , loop2); g_main_loop_run (loop2); g_main_loop_unref(loop2); }else printf("index not support\n"); } return NULL; } int main(void) { int i = 0; /* Create worker thread */ pthread_create(&pth1,NULL,threadFunc,THREAD1); pthread_create(&pth2,NULL,threadFunc,THREAD2); /* wait for our thread to finish before continuing */ while(1) { usleep(1); //printf("main() is running...\n"); //++i; } return 0; } 

命令构build:

 gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include thread.c -o thread -lglib-2.0 -lpthread 

结果:

 threadFunc: 2 threadFunc: 1 timeout_callback ==== 1 at 0 seconds 2 milliseconds timeout_callback ==== 2 at 0 seconds 72 milliseconds timeout_callback ==== 1 at 0 seconds 72 milliseconds timeout_callback ==== 2 at 0 seconds 142 milliseconds timeout_callback ==== 1 at 0 seconds 142 milliseconds timeout_callback ==== 2 at 0 seconds 218 milliseconds timeout_callback ==== 1 at 0 seconds 218 milliseconds timeout_callback ==== 2 at 0 seconds 283 milliseconds timeout_callback ==== 1 at 0 seconds 283 milliseconds timeout_callback ==== 2 at 0 seconds 348 milliseconds timeout_callback ==== 1 at 0 seconds 348 milliseconds timeout_callback ==== 2 at 0 seconds 421 milliseconds 

这个结果就像我所期望的那样。 我认为timeout_callback1多次调用timeout_callback2,因为在函数timeout_callback2有sleep(2);

你能帮我解释一下结果吗? 恳求给我一些build议如何timeout_callback1运行独立timeout_callback2?

非常感谢。

如果你在这里阅读g_timeout_add文档: https : //developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-timeout-add你可以找到:

这在内部使用g_timeout_source_new()创建主循环源并将其附加到全局GMainContext

从GMainContex这里: https : //developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#GMainContext

GMainContext结构是一个不透明的数据类型,代表一组要在主循环中处理的数据源。

此外:

GMainContext只能在单个线程中运行,但是可以将源添加到其中并从其他线程中删除。

因此,它实际上是有道理的,因为THREAD1THREAD2将以相同的速率调用g_timeout_add()