多线程遇到的问题例子(求一个c++多线程导致程序崩溃的例子)

本文目录
- 求一个c++多线程导致程序崩溃的例子
- 使用多线程时,主线程语句被重复执行
- 请教一个有关C++多线程产生重复数据的简单例子
- c语言多线程线程不执行的原因
- C#多线程问题:线程间操作无效: 从不是创建控件“label4”的线程访问它
- c语言多线程pthread的问题
- 多线程时间片问题
- C++多线程操作文件遇到的问题!
求一个c++多线程导致程序崩溃的例子
这个应该不难吧,对已经释放的地址double free程序都会出问题的,下面写了个简单例子你看下:
#include 《iostream》
#include 《Windows.h》
const static int ThreadCount = 10;
LPVOID param = "hello";
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
Sleep(100);
delete lpParam;
return 0;
}
int main()
{
HANDLE hThread;
for (int i = 0; i 《 ThreadCount; i++)
{
hThread = CreateThread(NULL, 0, ThreadProc, param, 0, 0);
}
WaitForMultipleObjects(ThreadCount, hThread, true, INFINITE);
for (int i = 0; i 《 ThreadCount; i++)
{
CloseHandle(hThread);
}
return 0;
}
使用多线程时,主线程语句被重复执行
我也写过不少类似的代码,但没有出现会重复输出的问题.这里存在的一个问题是,控制台为在多个线程中共享的资源,两个线程在没有同步的情况下使用控制台窗口(如上面代码是把字符打印输出),经常会出现如下问题:
用上面的例子来说吧,很可能主线程的刚刚输出"当前为",后面的"主线程"还没来得及输出,此时另一个线程抢先(在多核CPU中也可能是并发)运行输出"当前为分线程",接着主线程又获得运行权,接着输出"主线程".
解决这种问题的办法是使用同步对象.由于同步的方法比较多,而且牵涉到的内容如效率,死锁等等也比较难以三言两语讲清楚,这里就不细说了,如果想了解详情可以看看《WINDOWS核心编程》,里面有几章是专门讲多线程及同步技术的.
请教一个有关C++多线程产生重复数据的简单例子
两个线程共享同一会出现问题。
原理是这样的
比如数字A=100
这时候线程1和线程2都要执行 A-- 这条语句。
A--翻译成汇编是这样的:
mov ax,A
sub ax,1
mov A,ax
两个线程同时执行的时候你可以看到这样的情况
mov ax,A ;线程1,这时候ax=100,A=100
sub ax,1 ;线程1,这时候ax=99
mov ax,A ;线程2,这时候ax=100,A=100
sub ax,1 ;线程2,这时候ax=99
mov A,ax ;线程1,这时候A=99
mov A,ax ;线程1,这时候A=99
我们本来期望两个线程进行两次自减,但是结果却只减了1次。
解决方案:设置信号量就可以了~vc上有专门的api可以调用
c语言多线程线程不执行的原因
故障现象
使用多线程的时候,主函数尚且还在执行,但子函数却不执行。
if __name__==’__main__’:
print(’Parent process %s.’ % os.getpid())
p = Pool(processes = 4)
for i in range(30):
p.apply_async(func = stitch, args=(i,))
print(’Waiting for all subprocesses done...’)
p.close()
p.join()
print(’All subprocesses done.’)
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
如图所示,main会执行,但stitch就不会了。
原因分析
这是因为你的参数列表,也就是args和上面stitch函数的定义不一致。
解决方案
你只要把参数列表改为一致就可以了。
C#多线程问题:线程间操作无效: 从不是创建控件“label4”的线程访问它
一楼正解
你是写在GuidProc这个类里面的,这个是不行的.必须写在Form的类中或者子类中.就是说:this.Invoke中的this必须指的是一个窗体对象.
补充:
原因:声明的委托需要参数.
private delegate void SetTextDelegate(string value);
解决:修改代码.
if (this.InvokeRequired)
{
SetLabelText d = new SetLabelText(SetLabel1);
object arg = (object)要传入的参数值
this.Invoke(d,arg);//这里参数不对。
}
c语言多线程pthread的问题
***隐藏网址***
工程名.obj : error LNK2001: unresolved external symbol __imp__pthread_join
工程名.obj : error LNK2001: unresolved external symbol __imp__pthread_create
Debug/工程名.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe. 我自己以前编的一个例子,火车票窗口卖票的 如果不加锁就会出现-2,-1的问题 这里只是个事例 #include 《stdio.h》
#include 《stdlib.h》
#include 《pthread.h》
#include 《windows.h》int piao = 100; void* tprocess1(void* args){
while(piao》0){
Sleep(1);
piao--;
printf("窗口1----------------还剩%d张票\n",piao);
// Sleep(5);
}
return NULL;
}
void* tprocess2(void* args){
while(piao》0){
Sleep(1);
printf("窗口2----------------还剩%d张票\n",piao);
// Sleep(9);
}
return NULL;
}
void* tprocess3(void* args){
while(piao》0){
Sleep(1);
piao--;
printf("窗口3----------------还剩%d张票\n",piao);
// Sleep(10);
}
return NULL;
}
void* tprocess4(void* args){
while(piao》0){
Sleep(1);
piao--;
printf("窗口4----------------还剩%d张票\n",piao);
// Sleep(10);
}
return NULL;
}
int main(){
pthread_t t1;
pthread_t t2;
pthread_t t3;
pthread_t t4;
pthread_create(&t1,NULL,tprocess1,NULL);
pthread_create(&t2,NULL,tprocess2,NULL);
pthread_create(&t3,NULL,tprocess3,NULL);
pthread_create(&t4,NULL,tprocess4,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
pthread_join(t4,NULL);
}
多线程时间片问题
简单说来,就是CPU分配给各个程序的时间,使各个程序从表面上看是同时进行的,而不会造成CPU资源浪费
在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但是在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。
举个例子:
你同时输入两篇文档:A.txt和B.txt;
你在A中输入一个字之后,再在B中输入一个字,轮流输入,直至完成。总的看来你似乎在同时进行两篇文章的录入,你可以说我一边写A一边写B。但是具体到某个字时,就是沿着时间的前进,AB交替进行了。而你每个字输入所占用的这段时间,我们就可以称之为时间片。
举个多线程程序的例子,说明时间片是怎样工作的(java)
如上:
由此可见:两个线程是交替执行的(数字的变化),从宏观上(同时输出)。
以下是搜的资料:
1,什么是时间片轮转:
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法是时间片调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,,当进程用完它的时间片后,它被移到队列的末尾。
时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要一定时间的--保存和装入寄存器值及内存映像,更新各种表格和队列等。假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费在了管理开销上。
为了提高CPU效率,我们可以将时间片设为500毫秒。这时浪费的时间只有1%。但考虑在一个分时系统中,如果有十个交互用户几乎同时按下回车键,将发生什么情况?假设所有其他进程都用足它们的时间片的话,最后一个不幸的进程不得不等待5秒钟才获得运行机会。多数用户无法忍受一条简短命令要5秒钟才能做出响应。同样的问题在一台支持多道程序的个人计算机上也会发生。
结论可以归结如下:时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100毫秒通常是一个比较合理的折衷
C++多线程操作文件遇到的问题!
句柄和指针都可以有多个,读的时候可以同时读,但是写的时候要注意互斥,一次只能有一个进行写操作,并且写的时候不能读。这些可以使用mutex实现。

更多文章:
form表单制作(为什么制作的form表单会在网页显示中多出一行)
2026年10月11日 09:10
teammate(teammate,company,partner)
2026年10月11日 06:10
javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)
2026年10月11日 04:00
text函数公式(excel中round和text函数的区别是什么)
2026年10月11日 03:50
google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)
2026年10月11日 02:00
websocket整合springboot(Springboot整合Websocket遇到的坑)
2026年10月11日 01:40
drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)
2026年10月10日 19:20
xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)
2026年10月10日 17:50




