线程的创立和线程之间的资源的控制

来源:互联网 发布:世界网络发展史 编辑:程序博客网 时间: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加锁

0 0
原创粉丝点击