2

次のコードを使用して2つのスレッドを作成しました。

//header files
#include <pthread.h>
struct thread_arg
{
    int var1;
    int var2;
};
void *serv_com(void *pass_arg)
{
    struct thread_arg *con = pass_arg;
    //required statements irrelevant to the issue
    pthread_exit(NULL);
}
void *cli_com(void *pass_arg)
{
    struct thread_arg *con = pass_arg;
    //required statements irrelevant to the issue
    pthread_exit(NULL);
}
int main()
{
    pthread_t inter_com;
    //necessary code
    while(1)
    {
        th_err_s = pthread_create(&inter_com, NULL, serv_com, (void *)&pass_arg);
        th_err_c = pthread_create(&inter_com, NULL, cli_com, (void *)&pass_arg);
        if (th_err_s || th_err_c)
        {
            printf("Alert! Error creating thread! Exiting Now!");
            exit(-1);
        }
    }
    pthread_exit(NULL);
    return 1;
}

次に、次のコマンドを使用して、上記のコードをLinuxでコンパイルしました。

gcc -o sample sample.c

次のエラーメッセージが返されました。

inter.c:(.text+0x374): undefined reference to `pthread_create'
inter.c:(.text+0x398): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

このファイルを正しくコンパイルするにはどうすればよいですか。whileループ内のすべてをコメント化したとき、プログラムは正しくコンパイルされ、pthread_create構文が正しいことを確認したので、構文エラーなどはないと確信しています。ファイルをコンパイルするために他のコマンドを発行する必要がありますか?

編集:上記のコードで2つのスレッドを作成することに問題はありますか?プログラムは、実行されるとエラーメッセージを表示して終了します。考えられる問題は何で、どうすれば解決できますか?前もって感謝します。

4

3 に答える 3

4

これを試してみてください:

gcc -lpthread sample.c

また

gcc -pthread sample.c

上記の2つのコマンドは、実行可能ファイルa.outを直接作成します

編集後の回答:

1)呼び出しを使用して2つのスレッドがメインスレッドに参加するのを待ちます

int pthread_join(pthread_t thread, void **value_ptr);

2)異なるIDで両方のスレッドを作成します

3)可能であれば、main()からpthread_exitを呼び出さないでください。ただし、それを行っても害はありません。

4)while(1)でpthread_createを呼び出しています。これにより、無限のスレッドが作成されます。..何を達成しようとしているのかわかりません。

于 2012-05-18T11:15:03.853 に答える
2

コンパイル時にpthreadライブラリにリンクします...

gcc -o sample -lpthread sample.c

于 2012-05-18T10:53:49.220 に答える
0

自分自身はよくわかりませんが、次のようなことができると思います

pthread_t inter_com, inter_com2;

th_err_s = pthread_create(&inter_com, NULL, serv_com, (void *)&pass_arg);
        th_err_c = pthread_create(&inter_com2, NULL, cli_com, (void *)&pass_arg);

私はそれがあなたにスレッドの2つのIDを与えるべきだと思います。ただし、スレッド間で変数などを共有する場合は注意が必要です。しかし、あなたがそれを自分で解決してくれてうれしいです。

于 2015-08-14T18:43:17.317 に答える