多线程同步 急

czxooo 2007-01-10 10:12:05
现在有三个线程, A 线程负责与下位机通讯, B线程负责数据分析显示 C 线程负责存储数据


很显然B 和 C 线程 都得依赖于A 线程 取的数据.

也就是说 A 线程 先取得数据 然后 把数据给B 和 C 线程,B 和 C 线程处理完了后 A 线程又 开始取数据 就这样循环下去.


那么如何实现他们之间的同步呢??

看了线程同步的资料,能用事件和临界区同步,但具体如何实现呢?
ps:比较穷,只能给30分,望高手们帮忙
...全文
495 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
EvilLin 2007-01-19
  • 打赏
  • 举报
回复
LZ如果没有解决,给我发邮件,我给你发个例子.makala.cn@gmail.com
EvilLin 2007-01-18
  • 打赏
  • 举报
回复
用这个试试
class MtkMutex
{
friend class MtkGuard;
private:
CRITICAL_SECTION cs_;

public:

inline MtkMutex(void)
{
::InitializeCriticalSection(&cs_);
}

inline ~MtkMutex(void)
{
::DeleteCriticalSection(&cs_);
}

private:
//锁定函数
inline void Lock()
{
::EnterCriticalSection(&cs_);
}
//解锁函数
inline void UnLock()
{
::LeaveCriticalSection(&cs_);
}

};

class MtkGuard
{
private:
int lockCount_;
MtkMutex* pMutexObject_;
public:
MtkGuard(MtkMutex* pMutex, bool bAutoLock = true)
:pMutexObject_(NULL)
,lockCount_(0)
{
pMutexObject_ = pMutex;
if(bAutoLock)
Lock();
}
~MtkGuard()
{
while (lockCount_ > 0)
UnLock();
}
public:
void Lock()
{
if(pMutexObject_)
{
pMutexObject_->Lock();
lockCount_ ++;
}
}
void UnLock()
{
if(pMutexObject_)
{
pMutexObject_->UnLock();
lockCount_ --;
}
}
};

MtkMutex mutex_;

需要同步的地方:
MtkGuard guard(&mutex_);
lock在guard的构造函数里去做
unlock在析构里去搞
函数任何地方都可以随意返回,不用担心unlock
czxooo 2007-01-18
  • 打赏
  • 举报
回复
谢谢你们
还没有实现
老友问题:<
zcp126 2007-01-16
  • 打赏
  • 举报
回复
用event和setevent
guoxd2005 2007-01-16
  • 打赏
  • 举报
回复
建议使用消息队列,A线程把采集到的信息压入到消息队列,B线程从消息队列获取数据,消息队列的同步可以使用条件变量,B和C的通信类似
WingForce 2007-01-15
  • 打赏
  • 举报
回复
HANDLE g_hevt[3];

#define EVT_A 0
#define EVT_B 1
#define EVT_C 2

static void thread_a( void* para )
{

WaitForSingleObject( g_hevt[EVT_A], INFINITE );

/* do something */

SetEvent( g_hevt[EVT_B] );

return;
}

static void thread_b( void* para )
{
WaitForSingleObject( g_hevt[EVT_B], INFINITE );

/* do something */

SetEvent( g_hevt[EVT_C] );

return;
}

static void thread_b( void* para )
{
WaitForSingleObject( g_hevt[EVT_C], INFINITE );

/* do something */

SetEvent( g_hevt[EVT_A] );

return;
}

int main( int argc, char *argv[] )
{
g_hevt[EVT_A] = CreateEvent( NULL, TRUE, FALSE, NULL );
g_hevt[EVT_B] = CreateEvent( NULL, TRUE, FALSE, NULL );
g_hevt[EVT_C] = CreateEvent( NULL, TRUE, FALSE, NULL );

_beginthread( thread_a, 0, NULL );
_beginthread( thread_b, 0, NULL );
_beginthread( thread_c, 0, NULL );

SetEvent( g_hevt[EVT_A] )

/* ... */

system("PAUSE");
return 0;
}
czxooo 2007-01-15
  • 打赏
  • 举报
回复
TO 雨新 初六
用临界区可以同步,但是给出的代码,我的理解是a线程执行完后,b和c线程触发,但是b和c两个线程如何同步。
to 初六
线程a如何同步,我要的是循环的

谢谢各位朋友!


我尝试了几个方法,都没有用:《
望高手们赐教阿
goodmilk 2007-01-14
  • 打赏
  • 举报
回复
用事件Event,让线程B、C等待一个事件,当线程A收到数据,并把数据传给线程B、C后,事件受信,接着线程B、C可以继续进行,否则线程B、C一直等待。
yuxinxxgc 2007-01-13
  • 打赏
  • 举报
回复
CCriticalSection Section;

//A线程
Section.Lock();
for ( int m = 0; m < 10; m++ )
{
//写数据 共享数据区
}
Section.Unlock();

//B,C线呈处理方式
Section.Lock();
//读写数据 共享数据区
Section.Unlock();


WingForce 2007-01-13
  • 打赏
  • 举报
回复
找个用事件的例子来了

HANDLE g_hevt;

static void thread_a( void* para )
{

/* do something */

SetEvent( g_hevt );

return;
}

static void thread_b( void* para )
{
WaitForSingleObject( g_hevt, INFINITE );

/* do something */

return;
}

static void thread_c( void* para )
{
WaitForSingleObject( g_hevt, INFINITE );

/* do something */

return;
}

int main( int argc, char *argv[] )
{
g_hevt = CreateEvent( NULL, TRUE, FALSE, NULL );

_beginthread( thread_a, 0, NULL );
_beginthread( thread_b, 0, NULL );
_beginthread( thread_c, 0, NULL );

/* ... */

system("PAUSE");
return 0;
}
WingForce 2007-01-13
  • 打赏
  • 举报
回复
也可以用消息么



czxooo 2007-01-12
  • 打赏
  • 举报
回复
希望各位赐教阿
oyljerry 2007-01-10
  • 打赏
  • 举报
回复
mutex等
  • 打赏
  • 举报
回复
ab bc线程之间用一个队列或者什么的东西来交换数据。
交换数据的时候加锁,让ab两个线程只能同时有一个线程读取或者写入
bc线程也一样。

15,466

社区成员

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

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