0
typedef struct client
{
   pthread thread;
   Window_t *win
}client;

client * client_create(int ID)
{
    client *new_Client = (client *) malloc(sizeof(client));
    char title[16];

    if (!new_Client) return NULL;

    sprintf(title, "Client %d", ID);

    /* Creates a window and set up a communication channel with it */
    if ((new_Client->win = window_create(title))) 
        return new_Client;
    else {
        free(new_Client);
        return NULL;
    }
}

ユーザーが「e」と入力すると、新しいクライアントとウィンドウで新しいスレッドを作成しようとします。これは私のint_mainです。フラグは、ユーザーがeを入力したことを通知するためのものです。

if(eflag == 1)
{    
    client *c = NULL;
    c=client_create(started);
    pthread_create(&c.thread, NULL, client_create, (void *) &started);
    started++;
    eflag =0;
}

これは、新しいウィンドウの新しいスレッドに新しいクライアントを作成することになっていますが、それは行いません。

client_create関数が新しいウィンドウを作成するため、pthread_createに何を入れるか、また、クライアントの新しいインスタンスをどのように取得するかがわかりません。そして、pthread_createを実行して新しいスレッドを作成しようとすると、新しいウィンドウも作成されます...これがjavaの場合、ユーザーが「e」を押すたびに、クラスクライアントの新しいインスタンスを作成します...しかし、「できます」ここで本当にそうします。助言がありますか?

4

1 に答える 1

1

pthread_create関数のプロトタイプは次のとおりです。

int pthread_create(pthread_t *restrict thread,
              const pthread_attr_t *restrict attr,
              void *(*start_routine)(void*), void *restrict arg);

start_routine定義はvoid*(* start_routine)(void *)..と一致する必要があり、新しいスレッドコンテキストで実行されます。

void *my_client_routine(void *arg) {
    while(1) {
        // do what each client does.
    }
}

現在、main()で、create_client関数を2回実行しています。1回はpthread_create()の呼び出しの前に、もう1回はpthread_createから生成された新しいスレッドの一部として。あなたがおそらくやりたいことは

  c = create_client()
  pthread_create(&c.thread, NULL, my_client_routine, &args_that_client_routine_needs);
于 2013-02-22T05:42:43.687 に答える