需不需要同步

kone123 2010-03-08 04:04:37
问题是:现在一个线程A采集模拟量数据,一个线程B采集数字量数据,一个线程C用来发送数据;实现是要在A,B线程执行一次后,才执行线程C(也就是同时采集后,再发送数据),然后再A,B运行,之后C再运行,依次循环下去
关键这里有两个采集线,不知道需要用同步不?具体怎么实现,能给点思路吗?
...全文
249 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
SAKURA1987 2011-05-26
  • 打赏
  • 举报
回复
诸位都是学什么的?这么简单的问题讨论半天不清楚。教材上不是写了么:A、B、C、是一个伙伴组,互为前趋的伙伴组关系称为同步。他们三个自己知道谁是自己的前趋和后继,A、B运行完然后C运行?伙伴组之间是通信关系,C一直等待B发来的信号,B采集完数据给C发一个信号(事件)就行了。

我觉得各位都把A、B、C看作是3个独立不相关的进程了。独立不相关的进程之间不存在行为同步关系,互相不感知不认识的进程如何通信?——那是异步环境下的互斥竞争资源同步问题。
kone123 2010-03-09
  • 打赏
  • 举报
回复
引用 25 楼 wizardk 的回复:
引用 24 楼 kone123 的回复:还有怎么实现一秒发送一次数据(线程C发送数据),用定时器?

对:
XXX::OnTimer(...)
{
  do A;
  do A1;
  do A1;
  do B;
  do C;

  ...;
}

为什么主线程用循环代替Sleep();怎么子线程就不执行了?
WizardK 2010-03-09
  • 打赏
  • 举报
回复
引用 24 楼 kone123 的回复:
还有怎么实现一秒发送一次数据(线程C发送数据),用定时器?


对:
XXX::OnTimer(...)
{
do A;
do A1;
do A1;
do B;
do C;

...;
}
kone123 2010-03-09
  • 打赏
  • 举报
回复
还有怎么实现一秒发送一次数据(线程C发送数据),用定时器?
WizardK 2010-03-09
  • 打赏
  • 举报
回复
引用 22 楼 kone123 的回复:
引用 21 楼 wizardk 的回复:
引用 19 楼 wizardk 的回复:引用 17 楼 kone123 的回复: 引用 14 楼 wizardk 的回复: 引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗? 你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。 你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。 我给你的2楼的建议你实现了吗? 还有一个问题,如果子A线程中还包含一个子线程A1,要求A1完成后A才算完成,接着B完成,最后C线程,这样就和上面的一样了,这种情况该怎么处理好? 你这样A1,A和B就是顺序完成的了,没必要单独开辟多个线程,1个即可,由C触发

或者C也不要单开线程了,一个后台线程,先A1,再A,再B,再C即可
谢谢大哥的帮忙
不过,程序必须要先A,才能只执行A1,并且A1还要执行两次的,这个能实现吗?


顺序执行啊,在你的后台线程中:
while (1)
{
do A;
do A1;
do A1;
do B;
do C;
}
kone123 2010-03-09
  • 打赏
  • 举报
回复
引用 21 楼 wizardk 的回复:
引用 19 楼 wizardk 的回复:引用 17 楼 kone123 的回复: 引用 14 楼 wizardk 的回复: 引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗? 你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。 你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。 我给你的2楼的建议你实现了吗? 还有一个问题,如果子A线程中还包含一个子线程A1,要求A1完成后A才算完成,接着B完成,最后C线程,这样就和上面的一样了,这种情况该怎么处理好? 你这样A1,A和B就是顺序完成的了,没必要单独开辟多个线程,1个即可,由C触发

或者C也不要单开线程了,一个后台线程,先A1,再A,再B,再C即可

谢谢大哥的帮忙
不过,程序必须要先A,才能只执行A1,并且A1还要执行两次的,这个能实现吗?
WizardK 2010-03-09
  • 打赏
  • 举报
回复
引用 19 楼 wizardk 的回复:
引用 17 楼 kone123 的回复:
引用 14 楼 wizardk 的回复:
引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗?

你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。

你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。

我给你的2楼的建议你实现了吗?
还有一个问题,如果子A线程中还包含一个子线程A1,要求A1完成后A才算完成,接着B完成,最后C线程,这样就和上面的一样了,这种情况该怎么处理好?

你这样A1,A和B就是顺序完成的了,没必要单独开辟多个线程,1个即可,由C触发


或者C也不要单开线程了,一个后台线程,先A1,再A,再B,再C即可
eajum 2010-03-09
  • 打赏
  • 举报
回复
引用 18 楼 wizardk 的回复:
引用 16 楼 kone123 的回复:
引用 14 楼 wizardk 的回复:
引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗?

你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。

你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。

我给你的2楼的建议你实现了吗?
看看代码对不?
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
DWORD WINAPI Fun3Proc(LPVOID lpParameter);
DWORD WINAPI Fun4Proc(LPVOID lpParameter);
HANDLE hEventD;
HANDLE hEventE;
HANDLE hEventF;
HANDLE hEventG;
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE  hThread2;
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
HANDLE  hThread3;
hThread3=CreateThread(NULL,0,Fun3Proc,NULL,0,NULL);
HANDLE  hThread4;
hThread4=CreateThread(NULL,0,Fun4Proc,NULL,0,NULL);
    CloseHandle(hThread2);
CloseHandle(hThread3);
CloseHandle(hThread4);
hEventD=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEventD);
    hEventE=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEventE);
hEventF=CreateEvent(NULL,FALSE,FALSE,NULL);
//SetEvent(hEventF);
hEventF=CreateEvent(NULL,FALSE,FALSE,NULL);
//SetEvent(hEventF);
Sleep(200000);
      CloseHandle(hEventD);
  CloseHandle(hEventE);
  CloseHandle(hEventF);
  CloseHandle(hEventG);
return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventD,INFINITE);
printf("a\n");
SetEvent(hEventF);
}
return 0;
}
DWORD WINAPI Fun3Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventE,INFINITE);
printf("b\n");
SetEvent(hEventG);

}
return 0;
}
DWORD WINAPI Fun4Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventF,INFINITE);
        WaitForSingleObject(hEventG,INFINITE);
printf("c0000000000000000000\n");
SetEvent(hEventD);
SetEvent(hEventE);
}
return 0;
}

你的代码格式有点乱,我伪码写下,你对比下:
A、B、C三个线程,D、E、F、G四个事件
A和B分别等待D、E事件,事件到来时进行采集,并将数据写入各自对应的BUFFER,并分别置E、F事件。
C初始置D、E事件,C等待E、F事件,两个事件都到来时进行发送,发送后置D、E事件
C/C++ code
HANDLE g_hEventA[2];// work and quitHANDLE g_hEventB[2];// work and quitHANDLE g_hEventC[3];// A work done, B work done and quitint main()
{
...;
g_hEventA[0]= ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventA[1]= ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventB[0]= ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventB[1]= ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[0]= ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[1]= ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[2]= ::CreateEvent(NULL, FALSE, FALSE, NULL);
Create and run thread A;
Create and run thread B;
Create and run thread C;
...;

getch();
::SetEvent(g_hEventA[1]);
::SetEvent(g_hEventB[1]);
::SetEvent(g_hEventC[2]);

Close all handles above;return0;
}

UINT ThreadA (...)
{while (1)
{switch(::WaitForMultipleObjects(2, g_hEventA, FALSE, INFINITE))
{case WAIT_OBJECT_0:
Get data;break;case WAIT_OBJECT_0+1:goto A_QUIT;
}
}

A_QUIT:return0;
}

UINT ThreadB (...)
{while (1)
{switch(::WaitForMultipleObjects(2, g_hEventB, FALSE, INFINITE))
{case WAIT_OBJECT_0:
Get data;break;case WAIT_OBJECT_0+1:goto B_QUIT;
}
}

B_QUIT:return0;
}

UINT ThreadC (...)
{
HANDLE hEvent[2];

hEvent[0]= g_hEventC[0];
hEvent[1]= g_hEventC[1];
::SetEvent(g_hEventA[0]);// let A work now ::SetEvent(g_hEventB[0]);// let B work nowwhile (1)
{if (::WaitForSingleObject(g_hEventC[2],100)== WAIT_OBJECT_0)break;switch(::WaitForMultipleObjects(2, hEvent, TRUE,100))
{case WAIT_OBJECT_0:
Send data;
::SetEvent(g_hEventA[0]);// let A work again ::SetEvent(g_hEventB[0]);// let B work againbreak;default:break;
}
}return0;
}


很漂亮,学习了,字数不够因为我不信春哥
WizardK 2010-03-09
  • 打赏
  • 举报
回复
引用 17 楼 kone123 的回复:
引用 14 楼 wizardk 的回复:
引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗?

你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。

你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。

我给你的2楼的建议你实现了吗?
还有一个问题,如果子A线程中还包含一个子线程A1,要求A1完成后A才算完成,接着B完成,最后C线程,这样就和上面的一样了,这种情况该怎么处理好?


你这样A1,A和B就是顺序完成的了,没必要单独开辟多个线程,1个即可,由C触发
WizardK 2010-03-09
  • 打赏
  • 举报
回复
引用 16 楼 kone123 的回复:
引用 14 楼 wizardk 的回复:
引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗?

你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。

你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。

我给你的2楼的建议你实现了吗?
看看代码对不?
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
DWORD WINAPI Fun3Proc(LPVOID lpParameter);
DWORD WINAPI Fun4Proc(LPVOID lpParameter);
HANDLE hEventD;
HANDLE hEventE;
HANDLE hEventF;
HANDLE hEventG;
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE  hThread2;
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
HANDLE  hThread3;
hThread3=CreateThread(NULL,0,Fun3Proc,NULL,0,NULL);
HANDLE  hThread4;
hThread4=CreateThread(NULL,0,Fun4Proc,NULL,0,NULL);
    CloseHandle(hThread2);
CloseHandle(hThread3);
CloseHandle(hThread4);
hEventD=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEventD);
    hEventE=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEventE);
hEventF=CreateEvent(NULL,FALSE,FALSE,NULL);
//SetEvent(hEventF);
hEventF=CreateEvent(NULL,FALSE,FALSE,NULL);
//SetEvent(hEventF);
Sleep(200000);
      CloseHandle(hEventD);
  CloseHandle(hEventE);
  CloseHandle(hEventF);
  CloseHandle(hEventG);
return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventD,INFINITE);
printf("a\n");
SetEvent(hEventF);
}
return 0;
}
DWORD WINAPI Fun3Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventE,INFINITE);
printf("b\n");
SetEvent(hEventG);

}
return 0;
}
DWORD WINAPI Fun4Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventF,INFINITE);
        WaitForSingleObject(hEventG,INFINITE);
printf("c0000000000000000000\n");
SetEvent(hEventD);
SetEvent(hEventE);
}
return 0;
}


你的代码格式有点乱,我伪码写下,你对比下:
A、B、C三个线程,D、E、F、G四个事件
A和B分别等待D、E事件,事件到来时进行采集,并将数据写入各自对应的BUFFER,并分别置E、F事件。
C初始置D、E事件,C等待E、F事件,两个事件都到来时进行发送,发送后置D、E事件

HANDLE g_hEventA[2];// work and quit
HANDLE g_hEventB[2];// work and quit
HANDLE g_hEventC[3];// A work done, B work done and quit

int main()
{
...;
g_hEventA[0] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventA[1] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventB[0] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventB[1] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[0] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[1] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
g_hEventC[2] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
Create and run thread A;
Create and run thread B;
Create and run thread C;
...;

getch();
::SetEvent(g_hEventA[1]);
::SetEvent(g_hEventB[1]);
::SetEvent(g_hEventC[2]);

Close all handles above;

return 0;
}

UINT ThreadA (...)
{
while (1)
{
switch(::WaitForMultipleObjects(2, g_hEventA, FALSE, INFINITE))
{
case WAIT_OBJECT_0:
Get data;
break;
case WAIT_OBJECT_0 + 1:
goto A_QUIT;
}
}

A_QUIT:
return 0;
}

UINT ThreadB (...)
{
while (1)
{
switch(::WaitForMultipleObjects(2, g_hEventB, FALSE, INFINITE))
{
case WAIT_OBJECT_0:
Get data;
break;
case WAIT_OBJECT_0 + 1:
goto B_QUIT;
}
}

B_QUIT:
return 0;
}

UINT ThreadC (...)
{
HANDLE hEvent[2];

hEvent[0] = g_hEventC[0];
hEvent[1] = g_hEventC[1];
::SetEvent(g_hEventA[0]);// let A work now
::SetEvent(g_hEventB[0]);// let B work now
while (1)
{
if (::WaitForSingleObject(g_hEventC[2], 100) == WAIT_OBJECT_0)
break;
switch(::WaitForMultipleObjects(2, hEvent, TRUE, 100))
{
case WAIT_OBJECT_0:
Send data;
::SetEvent(g_hEventA[0]);// let A work again
::SetEvent(g_hEventB[0]);// let B work again
break;
default:
break;
}
}

return 0;
}
kone123 2010-03-09
  • 打赏
  • 举报
回复
引用 14 楼 wizardk 的回复:
引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗?

你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。

你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。

我给你的2楼的建议你实现了吗?

还有一个问题,如果子A线程中还包含一个子线程A1,要求A1完成后A才算完成,接着B完成,最后C线程,这样就和上面的一样了,这种情况该怎么处理好?
kone123 2010-03-09
  • 打赏
  • 举报
回复
引用 14 楼 wizardk 的回复:
引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗?

你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。

你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。

我给你的2楼的建议你实现了吗?

看看代码对不?
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
DWORD WINAPI Fun3Proc(LPVOID lpParameter);
DWORD WINAPI Fun4Proc(LPVOID lpParameter);
HANDLE hEventD;
HANDLE hEventE;
HANDLE hEventF;
HANDLE hEventG;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread2;
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
HANDLE hThread3;
hThread3=CreateThread(NULL,0,Fun3Proc,NULL,0,NULL);
HANDLE hThread4;
hThread4=CreateThread(NULL,0,Fun4Proc,NULL,0,NULL);
CloseHandle(hThread2);
CloseHandle(hThread3);
CloseHandle(hThread4);
hEventD=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEventD);
hEventE=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEventE);
hEventF=CreateEvent(NULL,FALSE,FALSE,NULL);
//SetEvent(hEventF);
hEventF=CreateEvent(NULL,FALSE,FALSE,NULL);
//SetEvent(hEventF);
Sleep(200000);
CloseHandle(hEventD);
CloseHandle(hEventE);
CloseHandle(hEventF);
CloseHandle(hEventG);
return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventD,INFINITE);
printf("a\n");
SetEvent(hEventF);
}
return 0;
}
DWORD WINAPI Fun3Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventE,INFINITE);
printf("b\n");
SetEvent(hEventG);

}
return 0;
}
DWORD WINAPI Fun4Proc(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hEventF,INFINITE);
WaitForSingleObject(hEventG,INFINITE);
printf("c0000000000000000000\n");
SetEvent(hEventD);
SetEvent(hEventE);
}
return 0;
}
kone123 2010-03-09
  • 打赏
  • 举报
回复
引用 14 楼 wizardk 的回复:
引用 13 楼 kone123 的回复:引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送为什么还要再创建一个线程,直接用C线程发送数据不行吗?

你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。

你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。

我给你的2楼的建议你实现了吗?

基本上可以了,不过在第一次运行的时候还不是好的,接着就可以了
像 A运行,接着C运行,然后就是需要的了(A,B运行后C运行),这个是怎么回事?
WizardK 2010-03-08
  • 打赏
  • 举报
回复
引用 13 楼 kone123 的回复:
引用 9 楼 zhou1xp 的回复:楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送
为什么还要再创建一个线程,直接用C线程发送数据不行吗?


你的问题里不涉及互斥的问题,因为你涉及同步,只要按照要求的方式同步即不会出现多线程对缓冲区写和读不匹配的问题。

你的需求,只是A和B接收完数据再整合发送,其实可以整体顺序执行,开一个后台线程在循环里完成顺序动作即可。但估计你可能要求A和B同时进行采集,所以建议A和B单独开辟线程,当然,WINDOW下多线程也不是真正的“同时”。至于为什么要开辟后台线程,是为了保证你的程序的主线程能够顺畅处理UI消息,保证程序界面显示和响应正常。

我给你的2楼的建议你实现了吗?
kone123 2010-03-08
  • 打赏
  • 举报
回复
引用 9 楼 zhou1xp 的回复:
楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送

为什么还要再创建一个线程,直接用C线程发送数据不行吗?
TANG_XIAO_BIN 2010-03-08
  • 打赏
  • 举报
回复
需要同步的,可以采用临界区或者互斥对象等!
如果可以同时进行,就用两个效率比较高!否则的话就循序执行吧!
kone123 2010-03-08
  • 打赏
  • 举报
回复
还有,我能不能将一个采集线程(A或B)作为主线程?
Eleven 2010-03-08
  • 打赏
  • 举报
回复
引用 8 楼 kone123 的回复:
引用 7 楼 visualeleven 的回复:
引用楼主 kone123 的回复:问题是:现在一个线程A采集模拟量数据,一个线程B采集数字量数据,一个线程C用来发送数据;实现是要在A,B线程执行一次后,才执行线程C(也就是同时采集后,再发送数据),然后再A,B运行,之后C再运行,依次循环下去   关键这里有两个采集线,不知道需要用同步不?具体怎么实现,能给点思路吗?
需要同步,线程A不断的等待AA事件,做完以后ResetEvent(AA),线程B不断的等待BB事件ResetEvent(BB),线程A和线程B做完以后分别设置CC事件SetEvent(CC)和DD事件SetEvent(DD),线程C等待CC和DD事件,做完以后设置AA事件SetEvent(AA)和BB事件SetEvent(BB),通知线程A和线程B继续运行。
当然你可能需要通知线程A和线程B还有线程C都stop的问题了。
“当然你可能需要通知线程A和线程B还有线程C都stop的问题了。”这个是什么意思?


就是线程退出的问题啦
zhou1xp 2010-03-08
  • 打赏
  • 举报
回复
楼主的A,B是不需要同步的,只是要A,B数据接收好了之后新建一个线程来发送数据,而不是用一个线程来发送,所以可能要4个线程,C线程用WaitForMultipleObjects()来等待A,B的信号,然后C再创建一个线程来发送
kone123 2010-03-08
  • 打赏
  • 举报
回复
引用 7 楼 visualeleven 的回复:
引用楼主 kone123 的回复:问题是:现在一个线程A采集模拟量数据,一个线程B采集数字量数据,一个线程C用来发送数据;实现是要在A,B线程执行一次后,才执行线程C(也就是同时采集后,再发送数据),然后再A,B运行,之后C再运行,依次循环下去   关键这里有两个采集线,不知道需要用同步不?具体怎么实现,能给点思路吗?
需要同步,线程A不断的等待AA事件,做完以后ResetEvent(AA),线程B不断的等待BB事件ResetEvent(BB),线程A和线程B做完以后分别设置CC事件SetEvent(CC)和DD事件SetEvent(DD),线程C等待CC和DD事件,做完以后设置AA事件SetEvent(AA)和BB事件SetEvent(BB),通知线程A和线程B继续运行。
当然你可能需要通知线程A和线程B还有线程C都stop的问题了。

“当然你可能需要通知线程A和线程B还有线程C都stop的问题了。”这个是什么意思?
加载更多回复(7)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧