2012-11-19 30 views
1

下面的代码不会编译和运行,除非输出不是我所期望的那样。我想程序输出Windows.h线程关联

“测试:”创建线程(取决于可用的多核数)的正数,并运行在程序结束时发现了一个简单的常规

后跟一个数字1-10。我得到的是一个输出写了几个数字,但最多不会超过两个,函数threadmain似乎并不完全在一个线程上运行,但它在某些情况下会输出测试: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; 
} 

回答

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; 
} 
+0

优秀!谢啦... – pandoragami