4种排序公用一个数组~~~使用互斥量防止访问冲突~~
- #include <windows.h>
- #include <tchar.h>
- #include <iostream>
- using namespace std;
- const int N=12;
- static int arr[12]={12,50,60,87,98,50,15,31,32,79,21,10};
- HANDLE hMutex;//互斥量句柄
- int data[N];
- void Show(int data[],int n)
- {
- for(int i=0;i<n;i++)
- cout<<data[i]<<"/t";
- cout<<"/n"<<endl;
- };
- void QuickSort(int _data[],int low,int high)//快速排序
- {
- for(int i=0;i<N;i++)
- data[i]=_data[i];
- int i,pivot,j;
- if(low<high)
- {
- pivot = data[low];i=low;j=high;
- while(i<j)
- {
- while(i<j&&data[j]>=pivot)
- j--;
- if(i<j) data[i++]=data[j];
- while (i<j&&data[i]<=pivot) i++;
- if(i<j) data[j--]=data[i];
- }
- data[i]=pivot;
- QuickSort(data,low,i-1);
- QuickSort(data,i+1,high);
- }
- };
- void MaoPaoSort(int data[])//冒泡排序
- {
- int list[N];
- for(int i=0;i<N;i++)
- list[i]=data[i];
- int j=1,temp;
- while((j<N))
- {
- for(int i=0;i<N-j;i++)
- {
- if(list[i]<list[i+1])
- {
- temp = list[i];
- list[i] = list[i+1];
- list[i+1] = temp;
- }
- }
- j++;
- }
- cout<<"MaoPao";
- Show(list,N);
- };
- void SortChoice(int data[])//选择排序
- {
- int list[N];
- for(int i=0;i<N;i++)
- list[i]=data[i];
- int min;
- for(int i=0;i<N-1;i++)
- {
- min=i;
- for(int j=i+1;j<N;j++)
- {
- if(list[j]<list[min])
- min=j;
- }
- int t=list[min];
- list[min]=list[i];
- list[i]=t;
- }
- cout<<"Choice:";
- Show(list,N);
- };
- void SortInsert(int data[])//插入排序
- {
- int list[N];
- for(int i=0;i<N;i++)
- list[i]=data[i];
- for(int i=1;i<N;i++)
- {
- int t=list[i];
- int j=i;
- while((j>0)&&(list[j-1]<t))
- {
- list[j]=list[j-1];
- --j;
- }
- list[j]=t;
- }
- cout<<"Insert:";
- Show(list,N);
- };
- void SortShell(int data[])//希尔排序
- {
- int list[N];
- for(int i=0;i<N;i++)
- list[i]=data[i];
- int inc;
- for(inc=1;inc<=N/9;inc=3*inc+1);
- for(;inc>0;inc/=3)
- {
- for(int i=inc+1;i<=N;i+=inc)
- {
- int t=list[i-1];
- int j=i;
- while((j>inc)&&(list[j-inc-1]>t))
- {
- list[j-1]=list[j-inc-1];
- j-=inc;
- }
- list[j-1]=t;
- }
- }
- cout<<"Shell:";
- Show(list,N);
- };
- //线程函数
- DWORD WINAPI Fun1Proc(LPVOID lpParameter)
- {
- WaitForSingleObject(hMutex,INFINITE);
- SortShell(arr);
- ReleaseMutex(hMutex);
- Sleep(1000);
- return 0;
- }
- DWORD WINAPI Fun2Proc(LPVOID lpParameter)
- {
- WaitForSingleObject(hMutex,INFINITE);
- MaoPaoSort(arr);
- ReleaseMutex(hMutex);
- Sleep(1000);
- return 0;
- }
- DWORD WINAPI Fun3Proc(LPVOID lpParameter)
- {
- WaitForSingleObject(hMutex,INFINITE);
- SortChoice(arr);
- ReleaseMutex(hMutex);
- Sleep(1000);
- return 0;
- }
- DWORD WINAPI Fun4Proc(LPVOID lpParameter)
- {
- WaitForSingleObject(hMutex,INFINITE);
- SortInsert(arr);
- ReleaseMutex(hMutex);
- Sleep(1000);
- return 0;
- }
- int main(int argc,char *argv[])
- {
- //主线程开始
- QuickSort(arr,0,11);
- Show(data,12);
- Sleep(2000);
- HANDLE hThread1,hThread2,hThread3,hThread4;//线程句柄
- //创建线程
- hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
- hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
- hThread3=CreateThread(NULL,0,Fun3Proc,NULL,0,NULL);
- hThread4=CreateThread(NULL,0,Fun4Proc,NULL,0,NULL);
- //关闭线程句柄
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- CloseHandle(hThread3);
- CloseHandle(hThread4);
- //创建互斥对象
- hMutex=CreateMutex(NULL,true,NULL);//true为主线程拥有互斥量,false为当前没有线程拥有互斥量
- //释放线程对象
- ReleaseMutex(hMutex);
- cin.get();
- return 0;
- }
互斥量的使用方法和临界区(共享代码段)类似,只是互斥量是在内核态实现的,临界区在用户态实现。