有关c++互斥对象的疑问?

来源:百度知道 编辑:UC知道 时间:2024/05/24 07:37:58
#include <windows.h>
#include<iostream>
using namespace std;

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

DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int index=0;
int tickets=100;
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);
/*while(index++<1000)
cout<<"main thread is running"<<endl;*/
//hMutex=CreateMutex(NULL,TRUE,NULL);
hMutex=CreateMutex(NULL,TRUE,"tickets");
if(hMutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"only instance can run!"<<endl;
return;
}
}
WaitForSingleObject(hMutex,INFINITE);
ReleaseM

一看你的代码就知道你这个是孙鑫15章教程里的东西。。自己修改了一下而已 。。。首先你的想法或思路就有问题 。。你想说的是。。你的线程1运行后就获得了互斥对象然后输出XXXXXXX,你希望是某个线程获取到互斥对象输出线程运行后就回到主线程。。执行检测那段代码是不?if(hMutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"only instance can run!"<<endl;
return;
}
这段代码的作用是检测是否有多个应用程序的实例在运行。。如果是就输出一段话来做提示。。只有1个实例能运行。。并放弃继续执行下去。。你自己在运行一个实例不就知道了嘛。。如果要实现你说的那样代码就不应该是这样写了 。。抱歉语气不太好。。不过我还是建议你再去看看孙鑫的15章。。看书不是说翻过去了就是看。。是你真的要明白里面的东西。。

哈哈,终于碰到个学到多线程的学习者了。抱歉哦,没时间看。
建议去专业的论坛交流一下,百度里菜鸟最多。
我学多线程的时候唯一碰到的问题是电脑是双核的。

你这代码写得有问题啊~大哥~~创建Mutex应该在创建线程前面啊~不然你的线程里面怎么等待这个Mutex啊~?

你说的输出问题,那是因为CreateThread创建的不是C++安全线程

应用了C++库的话应该使用_beginthreadex来创建线程

_beginthreadex会初始化一些C++全局变量,例如像控制台写锁,如果没这个锁,就会出现你的情况了,一个线程输出了一点点,然后第二个线程也输出了点点,看起来很怪的;使用_beginthreadex可以防止出现这种问题

总之,在使用到C库 C++库的时候,如果需要创建线程,建议使用_beginthreadex

有问题再留言