NEU操作系统实验课4——线程同步

实验要求:

创建两个线程按数字顺序打印10以下自然数,其中一个线程打印1-3及8-10;另一个线程打印4-6。要求使用线程同步机制实现上述打印顺序。

看网上的资料学习了两种写法

C++11的,使用了std::thread

 1 #include <unistd.h>
 2 #include <thread>
 3 #include <iostream>
 4 #include <mutex>
 5 #include<bits/stdc++.h>
 6 void Fun_1();
 7 void Fun_2();
 8 unsigned int counter=0;
 9 std::mutex mtx;
10
11 int main()
12 {
13     std::thread thrd_1(Fun_1);
14     std::thread thrd_2(Fun_2);
15     thrd_1.join();
16     thrd_2.join();
17     //system("pause");
18     return 0;
19 }
20
21 void Fun_1()
22 {
23     while(counter<10){
24         if(counter<3||counter>5)continue;
25         std::lock_guard<std::mutex> mtx_locker(mtx);
26         ++counter;
27         std::cout << "Function 1 counting " << counter << "...\n";
28         usleep(1);
29     }
30 }
31
32 void Fun_2()
33 {
34     while(counter<10){
35         if(counter>2&&counter<6)continue;
36         std::lock_guard<std::mutex> mtx_locker(mtx);
37         ++counter;
38         std::cout << "Function 2 counting " << counter << "...\n";
39         usleep(1);
40     }
41 }

C++11

C语言的,使用pthread

 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <stdlib.h>
 4 #include <unistd.h>
 5
 6 pthread_mutex_t mutex;
 7 pthread_cond_t cond1;
 8 pthread_cond_t cond2;
 9 int cnt=0;
10
11
12 void hander(void *arg)
13 {
14     free(arg);
15     (void)pthread_mutex_unlock(&mutex);
16 }
17
18 void *thread1(void *arg)
19 {
20     pthread_cleanup_push(hander,&mutex);
21     printf("thread1\n1\n2\n3\n");
22     pthread_mutex_lock(&mutex);
23     pthread_cond_wait(&cond1,&mutex);
24     pthread_mutex_unlock(&mutex);
25     printf("thread1\n7\n8\n9\n10\n");
26     pthread_cleanup_pop(0);
27 }
28
29 void *thread2(void *arg)
30 {
31     pthread_mutex_lock(&mutex);
32     pthread_cond_wait(&cond2,&mutex);
33     printf("thread2\n4\n5\n6\n");
34     pthread_cond_signal(&cond1);
35     pthread_mutex_unlock(&mutex);
36 }
37
38 int main()
39 {
40     pthread_t tid1,tid2;
41     pthread_mutex_init(&mutex,NULL);
42     pthread_cond_init(&cond1,NULL);
43     pthread_cond_init(&cond2,NULL);
44     pthread_create(&tid1,NULL,thread1,NULL);
45     pthread_create(&tid2,NULL,thread2,NULL);
46
47     sleep(1);
48     pthread_cond_signal(&cond2);
49     //sleep(2);
50     pthread_exit(0);
51     return 0;
52 }

C

时间: 2024-10-26 14:50:15

NEU操作系统实验课4——线程同步的相关文章

7.10-第十课:线程同步

================ 第十课  线程同步 ================ 一.竞争与同步 -------------- 当多个线程同时访问其所共享的进程资源时, 需要相互协调,以防止出现数据不一致. 不完整的问题.这就叫线程同步. 范例:vie.c 理想中的原子++: -----------------+-----------------+------ 线程1     |       线程2     | 内存 --------+--------+--------+--------+

操作系统:进程/线程同步的方式和机制,进程间通信

一.进程/线程间同步机制. 临界区.互斥区.事件.信号量四种方式临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event)的区别1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问.在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占.2.互斥量:采用互斥对象机

线程学习第一课--线程同步

在一个程序中的多个执行路线叫做线程线程是一个进程内部的一个控制序列 当进程执行fork调用时,创建出该进程的一份新的拷贝,这个新的进程拥有自己的变量和pid时间调度是独立的,执行也几乎是独立的. 当进程创建一个新的线程的时候,新的执行线程将有自己的栈,但是和创建者共享局部变量,文件描述符,信号句柄和当前目录状态. 线程的优点:    有时候让程序同时做两件事情是很有用的:对于数据服务器来说,这个明显的多任务工作如果用多进程    的方式来完成将很难做到高效率,因为各个不同的进程必须紧密合作才能满

实验十六 线程技术

实验十六  线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程的优先级属性及调度方法: (4) 掌握线程同步的概念及实现技术: 2.实验内容和步骤 实验1:测试程序并进行代码注释. 测试程序1: l 在elipse IDE中调试运行ThreadTest,结合程序运行结果理解程序: l 掌握线程概念: l 掌握用Thread的扩展类实现线程的方法: l 利用Runnable接口改造程序,掌握用Runnable

操作系统实验报告二

  操作系统实验报告二 姓名:许恺 学号:2014011329 日期:10月14日 题目1:编写线程池 关键代码如下: 1.Thread.h #pragma once #ifndef __THREAD_H #define __THREAD_H #include <vector> #include <string> #include <pthread.h> #pragma comment(lib,"x86/pthreadVC2.lib") using

操作系统实验报告四

操作系统实验4 题目1:编写页面内存的LRU替换算法 在实验3基础上考虑,如果当前分配的内存或保存页面的数据项已经被用完,这时再有新的网页请求,需要对已在内存中的网页数据进行替换,本实验内容需要使用LRU算法来对内存中的网页数据进行替换 题目2:编写页面内存的LFU替换算法 实现LFU(最少访问频率的页面替换)算法来管理内存页面 实验报告要求: 实验报告封面如下页所示. 按照题目要求,完成相关实验题目. 2.1报告中要包含完成此题目所查阅的一些关键技术材料.例如内存结构的设计.分配管理.回收方法

操作系统实验报告三

操作系统实验报告三 姓名:许恺 学号:2014011329 日期:2016.11.22 题目1:设计一段内存结构,能够缓存一定数量的网页,在客户端访问时,首先从内存中查找是否存在客户端访问的网页内容,如果存在,则直接从内存中将相应的内容返回给客户端:如果不存在,则从磁盘中将网页内容读入到内存,并返回给客户端   1.思想以及准备怎么做 在刚刚读完题目之后我的想法已经有了一点感觉要怎样做了,因为报告拖了比较久,所以老师也说过很多,好了直奔主题,首先要设计一段内存结构,用来缓存网页,其实就是做几个能

操作系统概念学习笔记 9 线程

操作系统概念学习笔记 9 线程 概述 单个进程可以包括多个控制线程. 线程 --一种CPU利用的基本单元,它是形成多线程计算机的基础. 线程是CPU使用的基本单元,它由线程ID.程序计数器.寄存器集合和栈组成.它与属于统一进程的其他线程共享代码段.数据段和其他操作系统资源. 一个传统重量级的进程只有单个控制线程,如果进程有多个控制线程,那么能同时做多个任务. 单线程与多线程 动机 一个应用程序通常是作为一个具有多个控制线程的独立进程实现的.如一个忙碌的网页服务器如果有多个(或数千个)客户并发访问

Visual C++线程同步技术剖析:临界区,事件,信号量,互斥量

转自: 使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的了解应当在其处理任务完成后进行. 如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解.例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题.如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数