现在的书籍 涉及到线程的部分 大部分都是讲单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个问题:
核多了,当然就会存在多个线程“同时”运行的情况。