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

[求助]线程同步

2010-5-22 23:54
4656
问题是这样的:
我创建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;
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (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下测试通过):
#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
游客
登录 | 注册 方可回帖
返回
//