2016-11-15 20 views
2

スレッドを実装し始めました。私は、1つのメインスレッドと2つのスレッドを並列に作成したい。 これは私のコードです:2スレッドはLinuxで並列

#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 

この結果is'n。私は考えているtimeout_callback1 timeout_callback2のため、timeout_callback2にはsleep(2)があるため、timeout_callback1はと呼ばれています。

結果について私に説明してもらえますか? そして、私はtimeout_callback1を独立性のあるtimeout_callback2で実行する方法をアドバイスしていますか?

はありがとうございました。

+0

'clock()'プロセス全体のCPU時間のみを測定します。 'sleep()'はCPUを消費しません。何を正確に測定したいですか? –

答えて

1

あなたがここにg_timeout_addドキュメント読んでいる場合: https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-timeout-addをあなたがそれを見つけることができます:

これは内部(g_timeout_source_new使用してメインループソースを作成)し、グローバルGMainContext

からにそれを添付GMainContextはこちら:https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#GMainContext

GMainContext構造体は次のとおりです。メインループで処理されるソースのセットを表す不透明なデータ型。

さらに:

GMainContextは、単一のスレッドで実行することができるが、ソースが それに加え、他のスレッドからそれから除去することができます。

THREAD1THREAD2の両方が同じ速度でg_timeout_add()を呼び出すことになるので、そのためには、実際には理にかなっています。

+0

まず、お返事いただきありがとうございます。私は各スレッドにgmainloopを使用せず、while(1):if(index == THREAD1){ \t \t // printf( "threadFunc:%d \ n"、インデックス); \t \t(1){ \t \t \t usleep(1); \t \t \t printf( "threadFunc:%d \ n"、index); \t \t}結果は良好です。ありがとうございました –

関連する問題