1

重複の可能性:
クラスからの pthread 関数

私はc ++を初めて使用し、TCPに関するプロジェクトを行っています。

スレッドを作成する必要があるので、ググってこれを見つけました。 http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

その構文に従いますが、エラーが発生します: タイプ 'void* (ns3::TcpSocketBase::)()' の引数が 'void* ( )(void )' と一致しません</p>

コード:

tcp-socket-base.h:
class TcpSocketBase : public TcpSocket
{
 public:
 ...
 void *threadfunction();
 ....
}




tcp-socket-base.cc:

void
*TcpSocketBase::threadfunction()
{
//do something
}



..//the thread was create and the function is called here
pthread_t t1;
int temp  =  pthread_create(&t1, NULL, ReceivedSpecialAck, NULL); //The error happens here
return;
...

どんな助けでも大歓迎です。ありがとう!

編集:

私はアドバイスを受けて、スレッド関数を非メンバー関数にしました。

namespaceXXX{

void *threadfunction()


int result  =  pthread_create(&t1, NULL, threadfunction, NULL);
      NS_LOG_LOGIC ("TcpSocketBase " << this << " Create Thread returned result: " << result );

void *threadfunction()
{
 .....
}


}

しかし、代わりにこのエラーが発生しました:

'int pthread_create(pthread_t*, const pthread_attr_t*, void* ( )(void ), void*)' の引数 3 を初期化します [-fpermissive]

4

3 に答える 3

2

クラスのメンバー関数を関数に渡しているように見えますpthread_create。スレッド関数は、次のシグネチャを持つ非メンバー関数である必要があります

void *thread_function( void *ptr );
于 2012-10-29T19:46:19.523 に答える
2

引き続き pthreads を使用したい場合の簡単な例は次のとおりです。

#include <cstdio>
#include <string>
#include <iostream>

#include <pthread.h>

void* print(void* data)
{
    std::cout << *((std::string*)data) << "\n";
    return NULL; // We could return data here if we wanted to
}

int main()
{
    std::string message = "Hello, pthreads!";
    pthread_t threadHandle;
    pthread_create(&threadHandle, NULL, &print, &message);
    // Wait for the thread to finish, then exit
    pthread_join(threadHandle, NULL);
    return 0;
}

可能であれば、新しい C++11スレッド ライブラリを使用することをお勧めします。これは、テンプレートを使用する単純な RAII インターフェイスであり、クラス メンバー関数を含む任意の関数をスレッドに渡すことができます (このスレッドを参照)。

次に、上記の例は次のように単純化されます。

#include <cstdio>
#include <string>
#include <iostream>

#include <thread>

void print(std::string message)
{
    std::cout << message << "\n";
}

int main()
{
    std::string message = "Hello, C++11 threads!";
    std::thread t(&print, message);
    t.join();
    return 0;
}

データを直接渡す方法に注意してください-キャストとキャストvoid*は必要ありません。

于 2012-10-29T20:53:09.227 に答える
0

関数を静的に宣言すると、コンパイルされます。

于 2012-10-29T20:36:38.130 に答える