上一页 1 ··· 6 7 8 9 10 11 12 13 14 下一页
摘要: //c语言线程池实现#ifndef __THREADPOOL__#define __THREADPOOL__#ifdef __cplusplusextern "C" {#endif //#endif#include#include#include#include#include#include/**线程池里所有运行和等待的任务都是一个CThread_Worker*由于所有任务都在链表里,所以是一个链表结构*/typedef struct Worker{ /*回调函数,任务运行时会调用此函数*/ void (*process)(void *arg); void *arg;/* 阅读全文
posted @ 2013-07-10 21:26 z折腾 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 在一个进程里,线程的调度有抢占式或者非抢占的模式。在抢占模式下,操作系统负责分配CPU时间给各个进程,一旦当前的进程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。实际上,系统运行每个进程的时间有2毫秒,然后调度其他的线程。它同时他维持着所有的线程和循环,分配很少量的CPU时间给线程。线程的的切换和调度是如此之快,以至于感觉是所有的线程 阅读全文
posted @ 2013-07-10 21:23 z折腾 阅读(1374) 评论(0) 推荐(0) 编辑
摘要: 线程应用程序最常见导致创建线程失败的原因是线程栈大小的设置。创建一个新的线程,默认情况下系统为线程栈预留了2MB的寻址空间。线程栈起始于进程虚拟内存的高端地址,并向虚拟内存底端地址方向扩展。取决于线程本身的大小以及其它线程内存分配的情况,进程虚拟地址空间消耗过快可能导致创建线程失败。这里有一个测试程序可以看到,Linux下最多可以创建多少个线程。#include #include #include void *ThreadFunc(){ static int count = 1; printf ("Create thread %d\n", count); pthread_d 阅读全文
posted @ 2013-07-10 21:22 z折腾 阅读(4323) 评论(0) 推荐(0) 编辑
摘要: 所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程) 阅读全文
posted @ 2013-07-09 23:24 z折腾 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!典型的UNIX系统都支持一个进程创建多个线程(thread)。在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也都基于进程。尽管实现方式有异于其它的UNIX系统,但Linux的多线程在逻辑和使用上与真正的多线程并没有差别。1. 多线程我们先来看一下什么是多线程。在Linux从程序到进程中,我们看到了一个程序在内存中的表示。这个程序的整个运行过程中,只有一个控制权的存在。当函数被调用的时候,该函数获得控制权,成为激活(active)函数,然后运行该函数 阅读全文
posted @ 2013-07-09 23:23 z折腾 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!计算机如何执行进程呢?这可以说是计算机运行的核心问题。即使我们已经编写好程序,但程序是死的文本,只有成为活的进程才能带来产出。我们已经从Linux进程基础中了解了进程的一些概况。现在我们看一下从程序到进程的漫漫征程。1. 一段程序我们下面展示一个简单的C语言程序,我们假设该程序已经经过编译,成为可执行的程序文件vamei.exe。#include int glob=0; /*global va... 阅读全文
posted @ 2013-07-09 23:19 z折腾 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 线程同步简单的说就是当多个线程共享相同的内存时,当某个线程可以修改变量,而其他线程也可以读取或修改这个变量的时候,就需要对这些线程进行同步,以确保他们在访问变量的存储内容时不会访问到无效的数值。我们来看个上面一个对于多线程访问共享变量造成竞争的一个例子假设增量操作分为以下三个步骤(1)从内存单元读入寄存器(2)在寄存器中进行变量值的增加(3)把新的值写回内存单元那么当两个 非同步线程对同一个变量做增操作时就可能出现下面这种情况也就是说如果两个人线程试图在几乎在同一时刻对同一个变量做增操作而不进行同步的话。结果就可能出现不一致。变量的值可能比原来增加了一也可能比原来的值增加了2.具体是1还是2. 阅读全文
posted @ 2013-07-09 22:29 z折腾 阅读(525) 评论(0) 推荐(0) 编辑
摘要: pthread_cond_wait() 了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。 首先,让我们考虑以下情况:线程为查看已链接列表而锁定了互斥对象,然而该列表恰巧是空的。这一特定线程什么也干不了 -- 其设计意图是从列表中除去节点,但是现在却没有节点。 因此,它只能: 锁定互斥对象时,线程将调用 pthread_cond_wait(&mycond,&mymutex)。pthread_cond_wait() 调用相当复杂,因此我们每次只执行它的一个操作。 pthread_cond_wa... 阅读全文
posted @ 2013-07-09 22:23 z折腾 阅读(207) 评论(0) 推荐(0) 编辑
摘要: #include #include #include //互斥变量和条件变量静态初始化pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/void *thread1(void *);void *thread2(void *);int i=1;int main(void){ // sleep(30); pthread_t t_a; pthread_t t_b; pthread_create(&... 阅读全文
posted @ 2013-07-08 23:42 z折腾 阅读(213) 评论(0) 推荐(0) 编辑
摘要: GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大。对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这个三进程系统:一、进程Proc2 是 Proc1 的子进程,Proc3 又是 Proc2 的子进程。如何使用 GDB 调试 proc2 或者 proc3 呢?实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。那么该如何调试子进程呢?其实我们可以利用GDB的特点或者其他一 阅读全文
posted @ 2013-07-07 23:26 z折腾 阅读(625) 评论(0) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 下一页