3

指定されたプログラムの場合::

void start(void *n){
  Node *obj = (Node *)n;
  cout << obj -> val;
}

int   
main(int argc, char *argv[])
{
  int i,n;
  cin >> n;
  Node *nodeObj;
  nodeObj = new Node[n];
  pthread_t *p = new pthread_t[n];
  for(i=0;i<n;i++){
    pthread_create(&p[i],NULL,start,(void *)(nodeObj[i]));   /*ERROR HERE in arg pass*/
  }                                                                               
  return 0;   
}

次のエラーが表示されます::

「void ( )(void )」から「void* ( )(void )」への無効な変換</p>

私は基本的に、作成した新しいスレッドのそれぞれに、オブジェクト、、... のそれぞれを送信したいと考えていNodeObj[0]ます。start 関数は、各スレッドの開始場所です。NodeObj[1]NodeObj[2]

4

4 に答える 4

4

これはおそらくあなたが望むことをするでしょう。まとめただけなので、構文エラーがある場合は事前にお詫び申し上げます。2 つの問題 ( の 3 番目と 4 番目のパラメーターが正しくないpthread_create()) に対処し、割り当て管理に RAII を使用します。

#include <iostream>
#include <vector>

using namespace std;

struct Node
{
    int value;
};

void *start(void* p)
{
    Node* obj = (Node*)p;
    cout << obj->value;
    return NULL;
}

int main(int argc, char *argv[])
{
    int n;
    cin >> n;
    if (n <= 0)
        return EXIT_FAILURE;

    std::vector<Node> nodes(n);
    std::vector<pthread_t> threads(n);
    for (int i=0;i<n;++i)
        pthread_create(threads.data()+i, NULL, &start, nodes.data()+i);

    std::for_each(threads.begin(), threads.end(),
                  [](pthread_t& t) { pthread_join(t, NULL); });

    return EXIT_SUCCESS;
}

C++11 スレッド : 夕食のネタ

raw-pthreads を使用するよりも、C++11 のスレッド クラスとオブジェクト (thread、mutex、condition_variable など) を使用することをお勧めします。彼らは本当にミツバチの膝です。似たようなもの (自動計算された N を使用) が以下に表示されます。

#include <iostream>
#include <vector>
#include <thread>
#include <memory>
using namespace std;

struct Node
{
    int value;
    Node() : value() {}

    // member function we're using as thread proc
    void thread_proc(int n)
    {
        value = n;
    }
};

int main(int argc, char *argv[])
{
    // allocate nodes
    vector<Node> nodes(std::max(std::thread::hardware_concurrency()+1, 4U));

    // starts threads
    vector<thread> threads;
    for (int i=0; i<nodes.size(); ++i)
        threads.emplace_back(std::bind(&Node::thread_proc, nodes.data()+i, i+1));

    // wait for all threads to complete.
    for(auto &t : threads)
        t.join();

    // proof we really did hit *our* nodes in the threads.
    for (auto& node : nodes)
        cout << "Node value: " << node.value << endl;

    return EXIT_SUCCESS;
}

出力

Node value: 1
Node value: 2
Node value: 3
Node value: 4
Node value: 5
于 2013-03-30T09:39:56.007 に答える
2

pthread_create()のLinux マニュアル ページには、良い例が含まれています。

thread_start 関数のシグネチャは次のとおりです。

void * thread_start(void *arg)

メイン関数では、引数を渡す方法を確認できます ( &tinfo[tnum] )。

pthread_create(&tinfo[tnum].thread_id, &attr, &thread_start, &tinfo[tnum]);

各スレッドは個別の引数セットを受け取ることに注意してください。

于 2013-03-30T09:40:44.857 に答える
2

コンパイラは、引数 3 の start_routine について不平を言っています。開始ルーチン (pthread_create の 3 番目の引数) は次のように指定されます:void *(*start_routine)(void *)メソッドへのポインター。引数として 1 つの void ポインター (void *) を取り、void ポインター (void *) を返します。

あなたのコードは、3 番目の引数として開始を渡しています。

void start(void *n){
    ...
}

関数が 3 番目の引数として取るように宣言されているものとの不一致。

開始を次のように変更します。

void *start(void *n) {
  return NULL;
}

エラーがなくなります。メソッドから返された値は、 を呼び出していない限り、スレッドの終了コードとして機能しますpthread_exit

于 2013-03-30T09:26:02.797 に答える
1

スレッド関数の戻り値の型は void * でなければなりません。

void* start(void *n)
{
//Code
}

次に、この方法で引数を関数に送信する必要があります。

pthread_create(&p[i],NULL,start,(void *)(&nodeObj[i])); 

引数の受け渡しの要件は、渡されるオブジェクトが何かへのポインターでなければならないということです。nodeObj はポインターですが、nodeObj[i] のような配列表記を使用すると、逆参照されます。したがって、アンパサンドを使用します。&nodeObj[i];

単純に使用することもできます(nodeObj+i);

于 2013-03-31T04:58:15.560 に答える