关于c/c++中多线程的使用
发布网友
发布时间:2022-04-26 18:41
我来回答
共3个回答
热心网友
时间:2023-10-21 14:00
1、首先 printf 根据链接的运行时库不同,是分担线程和多线程版本,你这个应该链接多线程版本,否则会出现这种奇怪的错误。
2、这种传递参数是可行的。将结构体的指针作为这个唯一的参数传过去就可以了
要注意变量的作用域。
热心网友
时间:2023-10-21 14:01
第一个出现那样的错误,和线程调度是有关系,如果创建一个线程之后,让主线程Sleep(1000),
就能的到你想要的结果,如下:
h = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)add,NULL,0,&id);
Sleep(1000);
h1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)sub,(LPVOID) 2,0,&id1);
Sleep(1000);
第二问题:答案是可行的,看了下msdn ,那里面给的解释是只能传一个参数追问亲,我知道延迟1秒后结果正确,但是我想知道为什么会出现这样的错误,cpu明明不按照我说的做了嘛。我让他调度一次h那个线程,他居然调度了两次,而且还遗忘了h1那个线程。请问这是为什么?
追答你运行一个exe程序,那么可以认为你启动了一个进程,进程中以main函数为主线程运行,一个线程运行需要资源,当一个线程阻塞,那么可能变成挂起或阻塞状态,等到线程拿到需要的资源和时间片,才能运行,这时它会去执行其他线程或进程,线程没结束之前,被阻塞,那么会保存当前的的运行状态和资源等一些记录,如果在printf处被阻塞,那么等拿到了资源和时间片之后,会重新执行printf语句,如果主线程执行完成,子线程还处于阻塞状态,那么资源也是会被释放掉的,也就是说存在显示的可能,这些都是线程调度问题,得到资源和时间片就会运行
热心网友
时间:2023-10-21 14:01
我试过是不会的,不知道你怎么会出现这种情况
你说的参数问题,CreateThread倒数第三个参数是个void指针,用来传递线程参数,任何对象取地址传递进去就是了,进了线程再解指针。
附上我测试的代码:
#include "stdafx.h"
#include "windows.h"
#include "conio.h"
int add()
{
printf("The result is %d\n", 1 + 2);
return 0;
}
int sub()
{
printf("The result is %d\n", 1 - 2);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD id1;
DWORD id2;
HANDLE h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)add, NULL, 0, &id1);
HANDLE h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)sub, NULL, 0, &id2);
WaitForSingleObject(h1, INFINITE);
WaitForSingleObject(h2, INFINITE);
_getch();
return 0;
}