pthread

读者写者之模型--同步问题

匿名 (未验证) 提交于 2019-12-03 00:29:01
再上一篇中,介绍了生产者消费者模型[ https://blog.csdn.net/Misszhoudandan/article/details/80715426] 今天介绍读者写者模型(读多写少的场景) 写者负责再资源池中写 读者负责从资源池中读数据 同一时间内不允许多个写者进行写,但允许多个读者进行读 当写者和读者都准备占用资源池时,写者优先占用资源池(此问题描述的时写者优先级高的场景) 一个交易场所(资源池),此处用一个变量供读者和写者进行读写 两种角色,一组读者线程和一组写者线程 三种关系: .读者和写者之间为互斥关系,写者优先级高 .读者和读者之间为共享关系(没有互斥关系) .写者和写者之间为互斥关系 这里采用POXI线程库中的读写锁来实现 #include <stdio.h> #include <pthread.h> #include <unistd.h> //读者写者模型(读的频率高,写的频率低) //读者和读者之间关系为 共享 //写者和写者之间关系为 互斥 //读者和写者之间关系为 同步互斥关系 //读写锁 //读者加读锁(读者之间共享) //写者加写锁(写者之间互斥) //写者优先获取锁(写者优先级高) pthread_rwlock_t rw_lock ; //定义一个读写锁 //*******实现一个交易场所******************** int

操作系统实验――矩阵乘法

匿名 (未验证) 提交于 2019-12-03 00:29:01
在windows操作系统上,利用Windows API编写程序用多线程实现矩阵乘法。实现A、B两个矩阵的乘法,并输出计算结果。 该实验相对比较简单,可先看实验报告的实验步骤,然后需要了解一下几个关于pthread里的函数使用: (1)pthread_join函数: 函数pthread_join用来等待一个线程的结束。 函数定义: int pthread_join(pthread_t thread, void **retval); 描述 : pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。 参数 : thread: 线程标识符,即线程ID,标识唯一线程。 retval: 用户定义的指针,用来存储被等待线程的返回值。 返回值 : 0代表成功。 失败,返回的则是错误号。 看下面一段程序: #include <pthread.h> #include <unistd.h> #include <stdio.h> void *thread (void *str ) { int i; for (i = 0 ; i < 10 ; ++i) { sleep ( 2 ); printf ( "This in the thread : %d \n"

经典生产者消费者模型

匿名 (未验证) 提交于 2019-12-03 00:28:02
在对linux 下的进程和线程的学习后,总结一下生产者消费者模型 生产者负责在生产池中进行生产 消费者负责消费生产池中的生产物 同一时刻生产池中只能有一个生产者/消费者 生产池中没有生产物时,消费者阻塞,直到生产者进行生产之后(生产池不未空),系统再唤醒消费者进行消费 生产池为满时,生产者阻塞,直到消费者进行消费之后(生产池未满),系统再唤醒生产者进行生产 一个交易场所(生产池),这里用一个带头结点的单向链表描述 两种角色,这里用若干个线程描述生产者,用若干个线程描述消费者 三种关系 : 生产者与生产者之间为 互斥关系 :消费者与消费者之间为 互斥关系 :生产者与消费者之间为 同步与互斥关系 采用互斥量和条件变量 #include <stdio.h> #include <signal.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> //生产者消费者模型 //生产者和生产者之间为互斥关系 //消费者和消费者之间为互斥关系 //生产者和消费者之间为同步互斥关系 pthread_mutex_t mutex; //互斥量 pthread_mutex_t mutex_con; pthread_cond_t p_cond; int count= 0 ; //1.实现交易场所(带头结点,不带环的单向链表(栈结构))

安全终止MFC线程

匿名 (未验证) 提交于 2019-12-03 00:22:01
下一个方法是另外保存线程的句柄。在线程创建后,将m_hThread保存在另一个变量中,以后访问这个变量就是了。但是要小心,在复制句柄以前线程并没有结束,最安全的方法是在AfxBeginThread中传入CREATE_SUSPENDED,保存句柄,然后通过调用ResumeThread,重新开始线程。这两种方法都可以帮助用户得到CWinThread对象的返回代码。 对于Worker线程,终止线程可以使用线程的退出码作为返回值从线程函数返回。 对于UI线程,因为有消息循环,需要发送一个WM_QUIT消息到线程的消息队列,当线程接收到WM_QUIT消息时退出消息循环。因此,结束线程可以在线程内部调用SDK的PostQuitMessage函数,发送WM_QUIT消息。 PostQuitMessage函数的定义如下: void PostQuitMessage( int nExitCode); 其中: nExitCode:线程的退出码。 MFC还提供了AfxEndThread函数,Worker线程和UI线程都可以通过在线程内部调用AfxEndThread函数结束线程。 AfxEndThread函数的定义如下: void AfxEndThread(UINT nExitCode, BOOL bDelete = TRUE); 其中: nExitCode:线程的退出码。 在MFC的THRDCORE

信号

匿名 (未验证) 提交于 2019-12-03 00:22:01
来自: https://blog.csdn.net/dawn_sf/article/details/74177899 信号与中断的区别: 信号与中断的相似点: (1)采用了相同的异步通信方式; (2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序; (3)都在处理完毕后返回到原来的断点; (4)对信号或中断都可进行屏蔽。 信号与中断的区别: (1)中断有优先级,而信号没有优先级,所有的信号都是平等的; (2)信号处理程序是在 用户态 下运行的,而中断处理程序是在 核心态 下运行; (3)中断响应是及时的,而信号响应通常都有较大的时间延迟。 在Linux下当我们想强制结束一个程序的时候,我们通常会给它发送一个信号然后该进程捕捉到信号,再然后该进程执行一定操作最 终 被终止. 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一 个错 误产生 的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生 成,接收到一个信号叫捕获。信号的捕捉这篇可能不会详细的说到,因为我想给它专门讲一个博客,因为信号捕捉的实例也是蛮多 的. 首先我们认识一下这些信号: $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5)

pthread_cond_wait

匿名 (未验证) 提交于 2019-12-03 00:09:02
while(1) 33 { 34 mm* p = NULL; 35 pthread_mutex_lock(&mutex); 36 while(head == NULL) 37    pthread_cond_wait(&cond, &mutex); 38 p = head->next; 39 printf("consumer %ld expense %d\n",pthread_self(), head->num); 40 free(head); 41 head = p; 42 pthread_mutex_unlock(&mutex); 43 } 这里 调用pthread_cond_wait等待条件的发生时,mutex会被 自动 释放。而且 pthread_cond_wait中的两个步骤必须是原子性的; 把调用线程放到条件等待队列上 释放mutex 调用这个函数进行等待条件的发生时,mutex会被自动释放 void enqueue_msg( struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_cond_signal(&qready); pthread_mutex_unlock(&qlock); } 如果把signal放在unlock之前,消费者线程会被唤醒

pthread_mutex_lock引起的core

匿名 (未验证) 提交于 2019-12-03 00:05:01
遇到一个奇怪的core core在pthread_mutex_lock下一行 最后发现: 某个线程pthread_mutex_lock的时候,另一个线程已经pthread_mutex_destroy掉这个锁 转载于:https://my.oschina.net/zipu888/blog/549563 来源:51CTO 作者: chushang0934 链接:https://blog.csdn.net/chushang0934/article/details/100825836

多线程

匿名 (未验证) 提交于 2019-12-02 23:51:01
1 #include <stdio.h> 2 #include <pthread.h> 3 4 void* say_hello(void* args) { 5 printf("hello from thread!\n"); 6 pthread_exit((void*)1); 7 return (void*) 1; 8 } 9 int main() { 10 pthread_t tid; 11 int iRet = pthread_create(&tid,NULL,say_hello,NULL); 12 if (iRet) { 13 printf("creat error:iRet = %d\n", iRet); 14 return iRet; 15 } 16 void *retval; 17 iRet = pthread_join(tid, &retval); 18 if (iRet) { 19 printf("join error: iRet = %d\n", iRet); 20 return iRet; 21 } 22 printf("retval = %d\n", (long)retval); 23 return 0; 24 }

windows平台pthread库应用

匿名 (未验证) 提交于 2019-12-02 23:43:01
2019独角兽企业重金招聘Python工程师标准>>> 库简要介绍 Pthread是由POSIX提出的一套通用的线程库,它广泛的被各种Unix系统所支持。因此,它Unix/Linux平台下具有很好的可移植性。然而,win32平台尚未看起来将来也不准备支持Pthread标准。为了解决这个为题,Pthread-w32提供了一个高效的win平台下的对Pthread线程库。通过使用这个库,我们可以更加方便的把win32程序移植到nix/Linux平台下,或者反过来。本文简单介绍了Pthread-w32的安装与使用。 官方网站: http://sourceware.org/pthreads-win32/ 库应用 下载Windows版本的pthread。 双击pthreads-w32-2-8-0-release.exe,会出现解压对话框,"browse"选择指定目录,"extract"解压,"done"完成。 完成后,该目录会多出三个文件夹:Pre-built.2,pthreads.2,QueueUserAPCEx。这里我们主要使用Pre-built.2,里面包含了编译好的lib和dll。我们需要的头文件和库文件也包含在这个文件夹中。pthreads.2文件夹中包含了源代码。我们也可自行编译需要的库文件。 新建一个win32控制台程序。命名为Pthread_Test。 在Project -

SCHED_FIFO与SCHED_OTHER调度机制

旧城冷巷雨未停 提交于 2019-12-02 23:28:51
疑问 两个线程分别有不同的调度策略,一个SCHED_FIFO,一个SCHED_OTHER,按照之前的理解,SCHED_FIFO实时线程一定会占用CPU一直运行,导致SCHED_OTHER的普通线程得不到CPU,事实是这样么? 验证 写了一小段代码,一个是验证SCHED_FIFO的高优先级线程会不会抢占低优先级的线程,在不主动放弃的情况下一直运行,一个是测试普通优先级的线程会不会得到CPU时间; 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #define __USE_GNU 5 #include <pthread.h> 6 #include <sched.h> 7 8 long long a = 0; 9 long long b = 0; 10 11 int attach_cpu(int cpu_index) 12 { 13 int cpu_num = sysconf(_SC_NPROCESSORS_CONF); 14 if (cpu_index < 0 || cpu_index >= cpu_num) 15 { 16 printf("cpu index ERROR!\n"); 17 return -1; 18 } 19 20 cpu_set_t mask; 21 CPU_ZERO(&mask)