0

C++ オブジェクトはブロック スコープを持つことができますか? たとえば、これは問題ありませんか: (クラッシュします)

(気楽に行きましょう、私はまだ C++ を学んでいます)

__block Poco::Thread* lastThread;

dispatch_async(dispatch_get_main_queue(), ^
{
    for (int i = 1; i <= 5; i++)
    {
        Poco::Runnable* worker = new  Worker(_counter, "worker" + Poco::NumberFormatter().format(i));
        Poco::Thread* workerThread = new Poco::Thread();
        workerThread->start(*worker);
        lastThread = workerThread;
    }
});

lastThread->join(); //wait so we can watch what happens. 
4

2 に答える 2

3

あなたのコードは有効です。そのポインター__blockスコープを宣言しても問題はありません。ただし、が呼び出されたlastThreadときにオブジェクトを指していないため、コードはクラッシュします。そのブロックを非同期で実行するため、ワーカー スレッドを指す前に到達することはjoin()ほぼ確実です。lastThread->join()lastThread

于 2013-01-28T01:18:03.433 に答える
2

はい、ポインターはブロックスコープを持つことができます。クラッシュする理由は、lastThread->join()とポインターの初期化の間に競合があるためです。

于 2013-01-28T01:22:12.313 に答える