1

以下のコードは、出力が期待どおりでないことを除いて、コンパイルおよび実行されます。プログラムにn個のスレッドを作成し(使用可能なマルチコアの数に応じて)、プログラムの最後にある簡単なルーチンを実行して出力するようにしたかったのです。

「テスト:」

1〜10の数字が続きます。代わりに私が得るのは、いくつかの数値を書き込む出力ですが、最大で2つを超えることはなく、関数threadmainは1つのスレッドで完全に実行されていないようですが、他のスレッドではテストを出力します:012。マルチスレッドが出力を壊してしまうことは知っていますが、画面のどこかに3,4,5,6,7,8,9の数字が表示されるはずですが、表示されません。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <cmath>
#include <iostream>

HANDLE *m_threads = NULL;
static DWORD_PTR WINAPI threadMain(void* p);

DWORD_PTR GetNumCPUs()
{
  SYSTEM_INFO m_si = {0, };
  GetSystemInfo(&m_si);
  return (DWORD_PTR)m_si.dwNumberOfProcessors;
}

CRITICAL_SECTION g_crit_sec;
static int g_start = 0;

int main(int argc, char **args)
{
  DWORD_PTR c = GetNumCPUs();

  m_threads = new HANDLE[c];

  InitializeCriticalSectionAndSpinCount(&g_crit_sec, 0x80000400);

  for(DWORD_PTR i = 0; i < c; i++)
  {
    DWORD_PTR m_id = 0;
    DWORD_PTR m_mask = 1 << i;

    m_threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadMain, (LPVOID)i, NULL, &m_id);
    SetThreadAffinityMask(m_threads[i], m_mask);

    //wprintf(L"Creating Thread %d (0x%08x) Assigning to CPU 0x%08x\r\n", i, (LONG_PTR)m_threads[i], m_mask);
  }

  return 0;
}
static DWORD_PTR WINAPI threadMain(void* p)
{
    double result = 0.0;

    for (int i = 0; i < 10; i++)
    {
        std::cout<<"testing: "<<i<<std::endl;
        //result = result + sin(i) * tan(i);
    }

  return 0;
}
4

1 に答える 1

5

スレッドの実行が完了する前に、アプリケーションが終了しています。次のように、スレッドを開始した後、メイン関数に、Sleep()またはより適切に呼び出しを入れます。WaitForMultipleObjects()

int main(int argc, char **args)
{
  DWORD_PTR c = GetNumCPUs();

  m_threads = new HANDLE[c];

  InitializeCriticalSectionAndSpinCount(&g_crit_sec, 0x80000400);

  for(DWORD_PTR i = 0; i < c; i++)
  {
    DWORD_PTR m_id = 0;
    DWORD_PTR m_mask = 1 << i;

    m_threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadMain, (LPVOID)i, NULL, (LPDWORD)&m_id);
    SetThreadAffinityMask(m_threads[i], m_mask);

    //wprintf(L"Creating Thread %d (0x%08x) Assigning to CPU 0x%08x\r\n", i, (LONG_PTR)m_threads[i], m_mask);
  }

  // Waits for all started threads to complete:
  WaitForMultipleObjects(c, m_threads, TRUE, INFINITE);

  return 0;
}
于 2012-11-19T18:25:33.007 に答える