线程的创立和线程之间的资源的控制
来源:互联网 发布:世界网络发展史 编辑:程序博客网 时间:2024/04/29 15:32
因为相同的进程中的线程是共享内存的。所以全局变量是可以在线程中共享的,还可以传参数。线程的使用:
pthread_t tid;
pthread_create (&tid, NULL, thread_routine, (void *) str);
thread_routine是要执行的函数, str 是想传进线程的参数的指针,
pthread_join (tid, (void *) &p);
这个函数是等待线程的结束,并用p来接受线程的返回值.
如果线程中使用了
pthread_detach (pthread_self ());
则在可以不用使用pthread_join (tid, (void *) &p);等待线程的结束.
ret = sem_init (&sem, 0, 1);
sem_wait (&sem);
操作资源
sem_post (&sem);
extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共
享;value给出了信号量的初始值。
函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的
一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。
函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公
共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem
的值减一。
函数sem_destroy(sem_t *sem)用来释放信号量sem。
互斥锁(mutex):
一般用于保护一个资源
mutex是一种简单的加锁的方法来控制对共享资源的访问。在同一时刻只能有一个线程掌握某个互斥上的锁,拥有
上锁状态的线程能够对共享资源进行访问。若其他线程希望上锁一个已经被上了互斥锁的资源,则该线程挂起,
直到上锁的线程释放互斥锁为止
这个函数的作用是对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。
pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前里程的局部信号量;否则,其它进程
就能够共享这个信号量。我们现在只对不让进程共享的信号量感兴趣。 (这个参数受版本影响), pshared传
递一个非零将会使函数调用失败。
互斥锁的使用:
互斥锁的操作主要包括以下几个步骤:
– 互斥锁初始化:pthread_mutex_init
– 互斥锁上锁:pthread_mutex_lock //阻塞函数
– 互斥锁判断上锁:pthread_mutex_trylock //非阻塞
– 互斥锁解锁:pthread_mutex_unlock
– 消除互斥锁:pthread_mutex_destroy
静态的:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init(&mutex, NULL);
在不同的线程中:
pthread_mutex_lock(&mutex)/pthread_mutex_trylock(&mutex); //上锁,代表着要用,别人不能用.
//...操作资源
pthread_mutex_unlock(&mutex); //表示用完了,解锁,别人可以用了.
pthread_mutex_destroy(&mutex); //用完了,不要锁了,扔掉吧.
动态的:
pthread_mutexattr_t mutexattr;
pthread_mutexattr_init (&mutexattr);
pthread_mutexattr_settype (&mutexattr, PTHREAD_MUTEX_TIMED_NP);
ret = pthread_mutex_init (&mutex, &mutexattr); /*初始化互斥锁 */
pthread_mutexattr_destroy (&mutexattr);
在不同的线程中:
pthread_mutex_lock(&mutex)/pthread_mutex_trylock(&mutex); //上锁,代表着要用,别人不能用.
//...操作资源
pthread_mutex_unlock(&mutex); //表示用完了,解锁,别人可以用了.
pthread_mutex_destroy(&mutex); //用完了,不要锁了,扔掉吧.
互斥锁可以配合条件变量来使用.
使用步骤:
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t v = PTHREAD_COND_INITIALIZER;
pthread_mutex_init(&m, NULL);
pthread_mutex_init(&v, NULL);
线程1: 线程2:
pthread_mutex_lock(&m); pthread_mutex_lock(&m);
pthread_cond_wait(&v, &m); pthread_cond_signal(&v); /*给某个线程发送条件信号.(或广播pthread_cond_broadcast(&v)) 广播条件信号
pthread_mutex_unlock(&m); pthread_mutex_unlock(&m);
pthread_cond_wait()执行的代码内部会发生以下三个事情:
1.解开前面代码加的mutex锁
2.检查条件变量cond是否满足条件(收到了其他线程的条件"信号")
如果满足条件,就到第三步,否则就睡眠【阻塞】
3.给前面代码的mutex加锁
pthread_t tid;
pthread_create (&tid, NULL, thread_routine, (void *) str);
thread_routine是要执行的函数, str 是想传进线程的参数的指针,
pthread_join (tid, (void *) &p);
这个函数是等待线程的结束,并用p来接受线程的返回值.
如果线程中使用了
pthread_detach (pthread_self ());
则在可以不用使用pthread_join (tid, (void *) &p);等待线程的结束.
ret = sem_init (&sem, 0, 1);
sem_wait (&sem);
操作资源
sem_post (&sem);
extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共
享;value给出了信号量的初始值。
函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的
一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。
函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公
共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem
的值减一。
函数sem_destroy(sem_t *sem)用来释放信号量sem。
互斥锁(mutex):
一般用于保护一个资源
mutex是一种简单的加锁的方法来控制对共享资源的访问。在同一时刻只能有一个线程掌握某个互斥上的锁,拥有
上锁状态的线程能够对共享资源进行访问。若其他线程希望上锁一个已经被上了互斥锁的资源,则该线程挂起,
直到上锁的线程释放互斥锁为止
这个函数的作用是对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。
pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前里程的局部信号量;否则,其它进程
就能够共享这个信号量。我们现在只对不让进程共享的信号量感兴趣。 (这个参数受版本影响), pshared传
递一个非零将会使函数调用失败。
互斥锁的使用:
互斥锁的操作主要包括以下几个步骤:
– 互斥锁初始化:pthread_mutex_init
– 互斥锁上锁:pthread_mutex_lock //阻塞函数
– 互斥锁判断上锁:pthread_mutex_trylock //非阻塞
– 互斥锁解锁:pthread_mutex_unlock
– 消除互斥锁:pthread_mutex_destroy
静态的:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init(&mutex, NULL);
在不同的线程中:
pthread_mutex_lock(&mutex)/pthread_mutex_trylock(&mutex); //上锁,代表着要用,别人不能用.
//...操作资源
pthread_mutex_unlock(&mutex); //表示用完了,解锁,别人可以用了.
pthread_mutex_destroy(&mutex); //用完了,不要锁了,扔掉吧.
动态的:
pthread_mutexattr_t mutexattr;
pthread_mutexattr_init (&mutexattr);
pthread_mutexattr_settype (&mutexattr, PTHREAD_MUTEX_TIMED_NP);
ret = pthread_mutex_init (&mutex, &mutexattr); /*初始化互斥锁 */
pthread_mutexattr_destroy (&mutexattr);
在不同的线程中:
pthread_mutex_lock(&mutex)/pthread_mutex_trylock(&mutex); //上锁,代表着要用,别人不能用.
//...操作资源
pthread_mutex_unlock(&mutex); //表示用完了,解锁,别人可以用了.
pthread_mutex_destroy(&mutex); //用完了,不要锁了,扔掉吧.
互斥锁可以配合条件变量来使用.
使用步骤:
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t v = PTHREAD_COND_INITIALIZER;
pthread_mutex_init(&m, NULL);
pthread_mutex_init(&v, NULL);
线程1: 线程2:
pthread_mutex_lock(&m); pthread_mutex_lock(&m);
pthread_cond_wait(&v, &m); pthread_cond_signal(&v); /*给某个线程发送条件信号.(或广播pthread_cond_broadcast(&v)) 广播条件信号
pthread_mutex_unlock(&m); pthread_mutex_unlock(&m);
pthread_cond_wait()执行的代码内部会发生以下三个事情:
1.解开前面代码加的mutex锁
2.检查条件变量cond是否满足条件(收到了其他线程的条件"信号")
如果满足条件,就到第三步,否则就睡眠【阻塞】
3.给前面代码的mutex加锁
0 0
- 线程的创立和线程之间的资源的控制
- C#中创建线程的方式,以及主线程和子线程之间的资源调用
- 控制并发线程数的Semaphore和线程之间的数据交换Exchanger
- 线程之间和进程之间的同步
- [线程]--线程之间的同步
- 线程的概念&线程控制&分离线程
- 线程资源的回收
- 线程资源的回收
- 线程之间的关系
- 线程之间的通信
- 线程之间的同步
- 线程之间的通信
- 线程之间的同步
- 线程之间的通信
- 线程之间的通信
- 线程之间的协作
- 线程之间的通信
- 线程之间的通信
- Python爬虫基础实例教程
- 大数据 IMF 传奇 spark -history在分布式 集群 的安装部署 及问题解决
- C#读写文本文件并导入Excel(二)
- 守护进程
- 打印城市坐标
- 线程的创立和线程之间的资源的控制
- Java基础练习 字母图形
- 云计算的基础概念
- 单例
- LightOJ 1028 1028 - Trailing Zeroes (I) (求因子个数)
- 2016
- POJ 3070 矩阵的幂
- VB脚本编写的小题库程序
- ES6学习——模块化:Module Loader API