2010-11-26 11 views

答えて

5

何ですか? tはスレッドであり、実際には何も表示されません。厳密に言えば、それはスレッドを表す変数です。実際にはスレッドを作成していませんが、作成すると仮定すると、それはmain()と同じプロセスで実行されるため、その意味ではメモリ空間を共有しますが、メインのスコープを共有する。そのスレッドで実行されるファンクションは、それらのファンクションのスコープ内にある変数をすべて見ることができます。

pthread_createへのユーザデータポインタとしてiへのポインタを渡すことができます。あるいは、i以上にアクセスする必要がある場合は、(とりわけ)iへのポインタなどを含む構造体へのポインタを渡すことができます。

例コード:

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

void *thread_entry_point(void *data) { 
    int *idata = static_cast<int*>(data); 
    std::cout << "thread: i = " << *idata << "\n"; 
    *idata = 23; 
    return const_cast<char*>("might as well return something"); 
} 

int main() { 
    int i = 12; 
    pthread_t thr; 

    int err = pthread_create(&thr, 0, thread_entry_point, &i); 
    if (err == 0) { 
     void *result; 
     pthread_join(thr, &result); 

     std::cout << "main: result = " << static_cast<const char*>(result) << "\n"; 
     std::cout << "main: i = " << i << "\n"; 
    } else { 
     std::cout << "error creating thread: " << err << " " << std::strerror(err) << "\n"; 
    } 
} 
+0

まあ...スレッド関数のスコープに入れるには、スレッドに引数として '&i'を渡すことができます。 –

+0

@アンドレ:うん、私はそこに行っている:-) –

+0

&アンドレ。誰かがそれがどのように動作するかを示す完全な作業コードを貼り付けることができます。明らかに私はPthreadを初めて使う人です。 – vrbilgi

3

のpthreadsは特別ではありません。たとえば、次のコードは、同じ「問題」があります。確かにfoomainによって呼び出され

void foo() 
{ 
    i = 5; 
} 
int main() 
{ 
    int i; 
    foo(); 
} 

を、ので、彼らも同じスレッドにしています。ただし、fooは、mainintが表示されません。解決策は単純です:foointを必要とする場合、mainはそれを渡す必要があります:あなたが共有するために必要なものを渡す:スレッドと

void foo(int& i) 
{ 
    i = 5; 
} 
int main() 
{ 
    int i; 
    foo(i); 
} 

は、状況は同じです。

関連する問題