使用事件的多线程求和
Multithreading Summation using Event
我试图强调我在多线程部分的知识,但我在让活动正常运行方面遇到了一些问题。
所以基本上我正在使用两个线程,一个线程只是将某个变量 yy1 设置为 1,第二个线程应该有一个等待函数来获取 yy1 的值并添加一个额外的值并将结果放入变量y2 .
我可以使用 Mutex 或信号量来做到这一点,但很难与它一起使用事件。
#include <process.h>
#include <windows.h>
#include <iostream>
#include <math.h>
using namespace std;
void ThreadFunction1(void *pParam);
void ThreadFunction2(void *pParam);
HANDLE h_Event1;
int yy1= 0;
int y2 = 0;
void main(void) // Primary Thread
{
h_Event1 = CreateEvent(NULL, // Security Attributes
FALSE, // Manual Reset: no/auto , Auto Reset when the event released
FALSE, // Initial Statse: not set , not occupied
NULL); // Name: no
_beginthread(ThreadFunction1, // Pointer to Thread Function
0, // Stack Size set automatically
(void*)&yy1); // Frequency
_beginthread(ThreadFunction2, // Pointer to Thread Function
0, // Stack Size set automatically
(void*)&y2); // Frequency
SetEvent(h_Event1);
CloseHandle(h_Event1);
cout << yy1<<endl;
cout << y2 << endl;
}
void ThreadFunction1(void *pParam) // Secundary Thread
{
int xx1;
xx1 = (int)*(int*)pParam;
WaitForSingleObject(h_Event1, INFINITE);
xx1 = 1;
*(int*)pParam = xx1;
Sleep(100);
_endthread();
}
void ThreadFunction2(void *pParam) // Secundary Thread
{
int xx1;
xx1 = (int)*(int*)pParam;
WaitForSingleObject(h_Event1, INFINITE);
xx1 = 1+ (yy1);
*(int*)pParam = xx1;
Sleep(10);
_endthread();
}
输出是:
0
2
注意:
我知道在那种情况下使用多线程可能没有意义,但我只是想习惯事件的使用。
您得到了您要求的行为。您启动了两个线程,并且都在等待事件。当您发出事件信号时,它们都会醒来并开始(以随机顺序)访问全局变量 yy1。由于数据竞争,您最终得到的是完全未定义且不稳定的行为。
我试图强调我在多线程部分的知识,但我在让活动正常运行方面遇到了一些问题。
所以基本上我正在使用两个线程,一个线程只是将某个变量 yy1 设置为 1,第二个线程应该有一个等待函数来获取 yy1 的值并添加一个额外的值并将结果放入变量y2 .
我可以使用 Mutex 或信号量来做到这一点,但很难与它一起使用事件。
#include <process.h>
#include <windows.h>
#include <iostream>
#include <math.h>
using namespace std;
void ThreadFunction1(void *pParam);
void ThreadFunction2(void *pParam);
HANDLE h_Event1;
int yy1= 0;
int y2 = 0;
void main(void) // Primary Thread
{
h_Event1 = CreateEvent(NULL, // Security Attributes
FALSE, // Manual Reset: no/auto , Auto Reset when the event released
FALSE, // Initial Statse: not set , not occupied
NULL); // Name: no
_beginthread(ThreadFunction1, // Pointer to Thread Function
0, // Stack Size set automatically
(void*)&yy1); // Frequency
_beginthread(ThreadFunction2, // Pointer to Thread Function
0, // Stack Size set automatically
(void*)&y2); // Frequency
SetEvent(h_Event1);
CloseHandle(h_Event1);
cout << yy1<<endl;
cout << y2 << endl;
}
void ThreadFunction1(void *pParam) // Secundary Thread
{
int xx1;
xx1 = (int)*(int*)pParam;
WaitForSingleObject(h_Event1, INFINITE);
xx1 = 1;
*(int*)pParam = xx1;
Sleep(100);
_endthread();
}
void ThreadFunction2(void *pParam) // Secundary Thread
{
int xx1;
xx1 = (int)*(int*)pParam;
WaitForSingleObject(h_Event1, INFINITE);
xx1 = 1+ (yy1);
*(int*)pParam = xx1;
Sleep(10);
_endthread();
}
输出是:
0
2
注意: 我知道在那种情况下使用多线程可能没有意义,但我只是想习惯事件的使用。
您得到了您要求的行为。您启动了两个线程,并且都在等待事件。当您发出事件信号时,它们都会醒来并开始(以随机顺序)访问全局变量 yy1。由于数据竞争,您最终得到的是完全未定义且不稳定的行为。