3

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#SCHEDULINGを参照

C++ で 2 つのスレッドを作成しようとしており、文字列をパラメーターとしてThread Start Routine. パラメーターは、定義に従ってThread Start Routineのみ型にすることができます。(void *)

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

しかし、私は以下のエラーが発生します:

$ make
g++ -g -Wall Trial.cpp -o Trial
Trial.cpp: In function `int main()':
Trial.cpp:22: error: cannot convert `message1' from type `std::string' to type `void*'
Trial.cpp:23: error: cannot convert `message2' from type `std::string' to type `void*'
Makefile:2: recipe for target `Trial' failed
make: *** [Trial] Error 1

コードは

#include <iostream>
#include <pthread.h>
#include <string>



using namespace std;

void *print_message_function( void *ptr );


int main()
{
    pthread_t thread1, thread2;

    string message1 = "Thread 1";
    string message2 = "Thread 2";

    int  iret1, iret2;


     iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
     iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);



     pthread_join( thread1, NULL);
     pthread_join( thread2, NULL);



     cout << "Thread 1 returns: " <<  iret1 << endl;
     cout << "Thread 2 returns: " << iret2 << endl;


    return 0;
    }
void *print_message_function( void *ptr )

{
     cout << endl <<  ptr << endl;
     //return 0;

}

パラメータstringとして渡す方法はありますか? (void *)またはC style strings、リンクの参照コードに示されているように、マルチスレッド パラメーターとしてのみ使用できます。

4

3 に答える 3

2

pthread_create を呼び出すときに、文字列オブジェクトのアドレス (メモリの場所) を取得する必要があります。

iret1 = pthread_create( &thread1, NULL, print_message_function, (void*)&message1);

そして、印刷するときにメモリ void* を文字列ポインターに変換する必要があります (ストリームに void* を書き込むことはできません。ストリームはそれをどう処理すればよいかわかりません)。

cout << endl <<  *(string*)ptr << endl;

これは機能するはずですが、完全に正しくするには、void* との間でキャストするときに reinterpret_cast を使用することを検討する必要があります。

于 2013-05-14T11:07:07.973 に答える
2

pthread_createすべての引数を単純な構造にラップすることで、任意の引数をメソッドに渡すことができます。例えば:

struct ThreadParams {
    std::vector<int> ints;
    std::string clientName;
    // more params
};

CreateThread 関数を呼び出す前にこの構造体を初期化し、ポインタを渡すだけです。

ThreadParams * params = new ThreadParams();
params.setParameters();
pthread_create(..., params);

void* print_message_function(void* arg)
    ThreadParams * params = reinterpret_cast<ThreadParams *>(arg);
    // delete after usage;
    delete params;
}
于 2013-05-14T11:05:20.543 に答える