int main()
{
int i;
pthread_t t;
}
私は見えませんか?メインはメインの内部に作成されていますか?これは、同じ共有メモリmain()が使用している必要があることを意味しますか?グローバル変数にすることなく、私がどのように見えるようにするには?pthreadsはmain()関数から変数にアクセスできませんか?
int main()
{
int i;
pthread_t t;
}
私は見えませんか?メインはメインの内部に作成されていますか?これは、同じ共有メモリmain()が使用している必要があることを意味しますか?グローバル変数にすることなく、私がどのように見えるようにするには?pthreadsはmain()関数から変数にアクセスできませんか?
何ですか? 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";
}
}
のpthreadsは特別ではありません。たとえば、次のコードは、同じ「問題」があります。確かにfoo
はmain
によって呼び出され
void foo()
{
i = 5;
}
int main()
{
int i;
foo();
}
を、ので、彼らも同じスレッドにしています。ただし、foo
は、main
にint
が表示されません。解決策は単純です:foo
はint
を必要とする場合、main
はそれを渡す必要があります:あなたが共有するために必要なものを渡す:スレッドと
void foo(int& i)
{
i = 5;
}
int main()
{
int i;
foo(i);
}
は、状況は同じです。
まあ...スレッド関数のスコープに入れるには、スレッドに引数として '&i'を渡すことができます。 –
@アンドレ:うん、私はそこに行っている:-) –
&アンドレ。誰かがそれがどのように動作するかを示す完全な作業コードを貼り付けることができます。明らかに私はPthreadを初めて使う人です。 – vrbilgi