多线程编程实验报告:线程同步与归并排序

需积分: 0 0 下载量 28 浏览量 更新于2024-08-05 收藏 606KB PDF 举报
多线程编程1 在多线程编程中,需要注意的一些问题包括: 1. 线程同步:在多线程编程中,需要使用同步机制来避免多个线程同时访问共享资源,导致数据不一致或其他问题。常见的同步机制有互斥锁、信号量、条件变量等。 2. 线程通信:在多线程编程中,需要使用通信机制来确保线程之间的数据交换和协作。常见的通信机制有管道、队列、共享内存等。 3. 线程安全:在多线程编程中,需要确保线程安全,以避免线程之间的冲突和数据不一致。 4. 死锁和饥饿:在多线程编程中,需要避免死锁和饥饿的出现。死锁是指两个或多个线程相互等待对方释放资源的状态,导致所有线程都无法继续执行。饥饿是指一个线程长时间无法获得所需的资源,导致该线程无法继续执行。 5. 上下文切换:在多线程编程中,需要注意上下文切换的开销。上下文切换是指操作系统将一个线程从运行状态切换到另一个线程的过程,需要保存当前线程的状态和恢复新线程的状态,增加了系统的开销。 在多线程编程中,需要注意的问题还包括线程池、线程优先级、线程wait和notify机制等。 在实验中,我们使用了互斥锁来实现线程同步。我们声明了一个全局互斥量for_global,全局变量global用于记录线程要输出的数字。在int main函数里创建4个线程,每个线程调用执行函数test,在这个过程中,第一个线程获得锁,从输出数据到释放锁之前,其他线程会被阻塞,直到前面的线程释放锁后,其他相应的线程才能获得锁,从而输出数据。 在实验二中,我们使用了归并排序算法来实现100000个随机数的排序。我们将数组number分成两部分,分别给两个子线程进行归并排序,两个子线程排完序后,再将这两个局部有序的部分,调用merge_array函数归并即可将这100000个数字有序排序。 merge_array函数的伪代码如下: ``` Merge_array(数组a[],起始位置,中间位置,结束位置,中间数组temp[]) { i=起始位置 j=中间位置的后一个位置 k=0 while(i<=中间位置并且j<=结束位置) { If(a[i]小于a[j]) { temp[k]<=a[i]; i++; //i后移一位 k++; //k后移一位 } else { temp[k]<=a[j]; j++; //j后移一位 K++; } } while(i<=mid) //前半部分数组剩余 Temp[k++]<... } ``` 在这个函数中,我们使用了两个指针i和j来遍历数组a[],并将其分成两部分,分别排序后,使用temp数组来存储排序后的结果。