首页
社区
课程
招聘
[求助]线程同步
发表于: 2010-5-22 23:54 4833

[求助]线程同步

2010-5-22 23:54
4833
问题是这样的:
我创建64个线程的时候同步是可以的,但当创建65个线程的时候就崩溃了。单独试了一下线程,可以创建65个以上的。是不是InterlockedExchange的限制?还是别的原因?谢谢啦。
// System.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>
using namespace std;

#include <Windows.h>
DWORD increased = 0;
LONG atom_increase = 0;
UINT IncreaseThread(LPVOID lpVoid)
{
        DWORD* ThreadID = (DWORD*)lpVoid;
        if (ThreadID)
        {
                int count = 0;
                while(count++<100)
                {
                        while(::InterlockedExchange(&atom_increase, 1) == 1)
                                ::Sleep(1);
                        cerr<<*ThreadID<<"\t"<<increased++<<endl;
                        ::InterlockedExchange(&atom_increase, 0);
                        ::Sleep(1);
                }
                cerr<<"thread "<<*ThreadID<<" quit"<<endl;
                delete ThreadID;
                return 0;
        }
        else
        {
                cout<<"invalid parameter!"<<endl;
                return 1;
        }
}

int _tmain(int argc, _TCHAR* argv[])
{
        HANDLE handles[100];
        for (int i = 0 ; i< 65; i++)
        {
                DWORD *Par = new DWORD;
                *Par = i;
                DWORD dwThreadID;
                handles[i] = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)IncreaseThread,
                        Par, 0, &dwThreadID);
                if (handles[i] == INVALID_HANDLE_VALUE)
                {
                        cout<<"create thread failed"<<i<<endl;
                }
        }
       
        ::WaitForMultipleObjects(65, handles, TRUE, INFINITE);
        cout<<"leave"<<endl;
        return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (8)
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
DWORD* ThreadID = (DWORD*)lpVoid;可以换成DWORD ThreadID = (DWORD)lpVoid;
CreateThread在C++编程里面是不安全的。可以用_beginthreadex();
2010-5-24 09:13
0
雪    币: 104
活跃值: (11)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
哦,学习了...
2010-5-24 09:44
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
#include "stdafx.h"
#include <Windows.h>
#include <process.h>

#include <iostream>
using namespace std;

#include <Windows.h>
DWORD increased = 0;
LONG atom_increase = 0;
unsigned int _stdcall IncreaseThread(void* lpVoid)
{
        DWORD ThreadID = *(DWORD*)(lpVoid);
        if (ThreadID)
        {
                int count = 0;
                while(count++<100)
                {
                        while(::InterlockedExchange(&atom_increase, 1) == 1)
                                ::Sleep(1);
                        cout<<ThreadID<<"\t"<<increased++<<endl;
                        if (count==100){
                                cout<<"thread "<<ThreadID<<" quit"<<endl;
                        }
                        ::InterlockedExchange(&atom_increase, 0);
                        ::Sleep(10);
                }
                Sleep(1);
                return 0;
        }
        else
        {
                cout<<"invalid parameter!"<<endl;
                return 1;
        }
}

int _tmain(int argc, _TCHAR* argv[])
{
        HANDLE handles[1000];
        cout << "请输入1-1000待创建的线程数" << endl;
        DWORD dwN = 0;
        cin >> dwN ;
        for (int i = 0 ; i< dwN; i++)
        {
                DWORD* ptr = new DWORD;
                *ptr = i;
                unsigned int dwThreadID;
                handles[i] = (HANDLE)_beginthreadex(NULL, 0, IncreaseThread,
                        ptr, 0, &dwThreadID);
                if (handles[i] == INVALID_HANDLE_VALUE){
                        cout<<"create thread failed"<<i<<endl;
                }
        }
        // 设置不受信(WaitForMultipleObjects根本没有用,强制主线程不退出)
        Sleep(INFINITE);
        ::WaitForMultipleObjects(66, handles, TRUE, INFINITE);
        cout<<"leave"<<endl;
        return 0;
}
修改了你的代码,你试下这个。(_beginthreadex()要用多线程库才能编译成功)
2010-5-24 13:32
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
o my god , 没有 delete掉
2010-5-24 13:33
0
雪    币: 440
活跃值: (87)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
6
1.CreateThread在失败时返回NULL,而不是INVALID_HANDLE_VALUE(-1).
2.句柄使用完后要使用CloseHandle关闭。
3.WaitForMultipleObjects的第一个参数用于指明调用线程想要查看内核对象的数目,这个值必须在1到MAXIMUM_WAIT_OBJECTS(64)之间。
4.不知道楼主是否在测试中会看到乱码。这是由于没有对输出进行同步控制的缘故。
下面是我修改后的代码(VC6下测试通过):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
using namespace std;
 
#include <Windows.h>
#include "tchar.h"
 
DWORD increased = 0;
LONG atom_increase = 0;
LONG atom_stdout_inUse = 0;/* 控制输出的同步,否则可能会出现乱码 */
 
UINT IncreaseThread(LPVOID lpVoid)
{
    DWORD* ThreadID = (DWORD*)lpVoid;
    if (ThreadID)
    {
        int count = 0;
        while(count++<3)
        {
            while(::InterlockedExchange(&atom_increase, 1) == 1)
                ::Sleep(1);
 
            /* 占用stdout */
            while (::InterlockedExchange(&atom_stdout_inUse, 1)==1)
            {
                ::Sleep(1);
            }
            cout<<"Thread "<<*ThreadID<<"\t"<<increased++<<endl;
            ::InterlockedExchange(&atom_stdout_inUse, 0);   /* 释放stdout */
 
            ::InterlockedExchange(&atom_increase, 0);
            ::Sleep(1);
        }
 
        /* 占用stdout */
        while (::InterlockedExchange(&atom_stdout_inUse, 1)==1)
        {
            ::Sleep(1);
        }
        cout<<"Thread "<<*ThreadID<<" quit"<<endl;
        ::InterlockedExchange(&atom_stdout_inUse, 0);   /* 释放stdout */
 
        delete ThreadID;
        return 0;
    }
    else
    {
        /* 占用stdout */
        while (::InterlockedExchange(&atom_stdout_inUse, 1)==1)
        {
            ::Sleep(1);
        }
        cout<<"invalid parameter!"<<endl;
        ::InterlockedExchange(&atom_stdout_inUse, 0);   /* 释放stdout */
        return 1;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE handles[100];
    DWORD  nThreadCount = 64;
    for (int i = 0 ; i< nThreadCount; i++)
    {
        DWORD *Par = new DWORD;
        *Par = i;
        DWORD dwThreadID;
        handles[i] = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)IncreaseThread,
            Par, 0, &dwThreadID);
        if (handles[i] == NULL)
        {
            cout<<"create thread failed"<<i<<endl;
        }
    }
     
    ::WaitForMultipleObjects(nThreadCount, handles, TRUE, INFINITE);
    for (i=0; i<nThreadCount; i++)
    {
        CloseHandle(handles[i]);
    }
    cout<<"leave"<<endl;
    return 0;
}
2010-5-24 13:51
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
还是“密码学小组(见习)理论及数学组”厉害
2010-5-24 14:01
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这么多线程,是并行计算?
2010-5-25 08:15
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
非常感谢!呵呵。
2010-5-27 18:31
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册