【问题标题】:2 thread parallel in linuxlinux 2线程并行
【发布时间】:2017-03-29 16:12:33
【问题描述】:

我刚刚开始实现线程。我想创建 1 个主线程和 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;
}

命令构建:

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);

你能帮我解释一下结果吗? 请给我一些建议,如何让 timeout_callback1 独立运行 timeout_callback2 ?

非常感谢。

【问题讨论】:

  • clock() 仅测量整个过程的 CPU 时间。 sleep() 不消耗任何 CPU。您想准确测量什么?

标签: c linux multithreading process glib


【解决方案1】:

如果您在此处阅读 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()

【讨论】:

  • 首先,感谢您的回复。我不对每个线程使用 gmainloop,而是使用 while(1): if (index == THREAD1){ //printf("threadFunc: %d\n", index); while(1){ 睡眠(1); printf("threadFunc: %d\n", index); } 结果很好。谢谢建议
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多