当前位置: 代码迷 >> 多核软件开发 >> 多cpu 多线程同步,该怎么处理
  详细解决方案

多cpu 多线程同步,该怎么处理

热度:10161   发布时间:2013-02-26 00:00:00.0
多cpu 多线程同步
现在的书籍 涉及到线程的部分 大部分都是讲单cpu的 没有讲到多cpu的情况 

#include <windows.h>
#include <stdio.h>
HANDLE g_hEvent = NULL;
int nTickets = 100;
int nIndex = 1;

void print()
{
::WaitForSingleObject(g_hEvent, INFINITE);
::ResetEvent(g_hEvent);

if (nIndex == 1)
{
printf("thread%d: %d\n", nIndex++, nTickets--);
}
else
{
printf("thread%d: %d\n", nIndex--, nTickets--);
}

::SetEvent(g_hEvent);
}

DWORD WINAPI myThread1(LPVOID lp)
{
while (TRUE)
{
if (nTickets == 0)
{
break;
}

print();
}

return 0;
}

DWORD WINAPI myThread2(LPVOID lp)
{
while (TRUE)
{
if (nTickets == 0)
{
break;
}

print();
}

return 0;
}


void main()
{
g_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);

::SetEvent(g_hEvent);

::CloseHandle(::CreateThread(NULL, 0, myThread1, NULL, 0, NULL));
::CloseHandle(::CreateThread(NULL, 0, myThread2, NULL, 0, NULL));

::Sleep(4000);
}

以上是测试以事件方式同步线程的小程序 是人工重置事件的方式 写的不太好 就那么个意思 
这个程序 在单cpu的操作系统下 没有任何问题 
但在双cpu的系统下 这个代码跑的就不怎么样了 
下面有两个问题 
1。在双cpu下 两个线程myThread1和myThread2下 两个线程会同时执行吗??这里我说的同时执行 并不是说那种cpu时间片的轮转 而是真正意义上的同时执行 

2。如果两个线程同时执行 那么两个线程可能会同时进入到print函数里 而函数在代码区 地址是唯一的 那么假如print函数几个形参的话 那么当两个线程同时进入到print函数中的时候 print函数是如何同时去处理两个线程传递进来的实参的呢 

正常情况下 一个函数是不可能去同时处理两个线程中的局部变量的不是吗

------解决方案--------------------------------------------------------
先说你的第2个问题:

你在这里存在认识错误。每个线程有自己的栈,函数的局部变量、参数等都是在线程自己的栈里,所以,多个线程就会有多个栈,局部变量之间不会有地址上的重叠,不会互相影响。只使用局部变量的函数,都是“线程安全”的函数。 比如,strlen函数。而线程不安全的函数里比较著名的是malloc,它使用了全局变量。

再说你的第1个问题:
核多了,当然就会存在多个线程“同时”运行的情况。
  相关解决方案