问个多线程同步的问题!

Csuxiaowu 2010-08-23 10:57:37
有一个队列,用来存储需要下载的文件名字,
每次点击下载就将下载的文件名字添加到队列里面去。
现在,需要创建线程来取得队列里面的文件名并执行下载的任务,如果队列里面只有一个文件名,就只需要创建一个下载线程
这就不需要做同步处理,
如果有2个或以上则需要做同步处理。
谁可以给几行示例一下?
void CxxxDlg::OnBnClickedDownLoad()
{
//就是这里该怎么写?
}
因为如果只是创建一个线程(此时不做同步处理),当进入线程函数中,但是还没有取出队列中的数据,而此时,又点击了一次下载按钮,此时就有两个文件名排队,就需要同步处理了。
这种可以不可以使用线程池?
...全文
140 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
libinfei8848 2010-08-24
  • 打赏
  • 举报
回复
可以做个线程池,大部分情况下可以提高响应速度
做个线程池,让这些线程不停的去队列中查看是否有任务要做,当然队列进出的时候需要加锁来同步
如:

Thread_fun(void *p)
{
while(1)
{
pthread_mutex_lock。。
//队列操作
pthread_mutex_unlock
}
}
hengshan 2010-08-24
  • 打赏
  • 举报
回复
那我问你,是不是有多少个文件名就创建多少个线程?文件名太多了,还能创建出来线程?
线程多了,就会影响效率。

我觉得啊,你用 生产者、消费者模型,比较好
FlyToTMoon 2010-08-24
  • 打赏
  • 举报
回复
我是看的孫鑫視頻的代碼,L15裏面有講解
FlyToTMoon 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 csuxiaowu 的回复:]
引用 1 楼 hengshan 的回复:

那我问你,是不是有多少个文件名就创建多少个线程?文件名太多了,还能创建出来线程?
线程多了,就会影响效率。

我觉得啊,你用 生产者、消费者模型,比较好

我不是想要创建很多线程 我只是想创建2个而已
[/Quote]
2個線程就用我給你的代碼,這個是我的項目里的一段,可以用
Csuxiaowu 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hengshan 的回复:]

那我问你,是不是有多少个文件名就创建多少个线程?文件名太多了,还能创建出来线程?
线程多了,就会影响效率。

我觉得啊,你用 生产者、消费者模型,比较好
[/Quote]
我不是想要创建很多线程 我只是想创建2个而已
Csuxiaowu 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 libinfei8848 的回复:]

可以做个线程池,大部分情况下可以提高响应速度
做个线程池,让这些线程不停的去队列中查看是否有任务要做,当然队列进出的时候需要加锁来同步
如:
C/C++ code

Thread_fun(void *p)
{
while(1)
{
pthread_mutex_lock。。
//队列操作
pthread_mutex_unl……
[/Quote]
我是新手啊 我看《windows核心编程》里面说了 有几种情况可以用线程池 我看不懂
FlyToTMoon 2010-08-24
  • 打赏
  • 举报
回复
#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);

DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int index=0;
HANDLE hMutex;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);

hMutex=CreateMutex(NULL,FALSE,NULL);
...//加入計數器,並在thread1,thread2中對計數器操作

WaitForSingleObject(hMutex,INFINITE);
ReleaseMutex(hMutex);
ReleaseMutex(hMutex);
Sleep(4000);

}

DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
...//thread1 code
else
break;
ReleaseMutex(hMutex);
}
}

DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
...//thread2 code
else
break;
ReleaseMutex(hMutex);
}
return 0;
}

最主要的就是hMutex
dingshaofengbinbin 2010-08-24
  • 打赏
  • 举报
回复
用CMutex互斥体。

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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