Linux 多线程同步(信号量)
Linux 多线程同步(信号量)
sem_wait函数也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。也就是说,如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,这信号量的值将减到1。如果对一个值为0的信号量调用sem_wait(),这个函数就 会地等待直到有其它线程增加了这个值使它不再是0为止。如果有两个线程都在sem_wait()中等待同一个信号量变成非零值,那么当它被第三个线程增加 一个“1”时,等待线程中只有一个能够对信号量做减法并继续执行,另一个还将处于等待状态。
sem_post函数的作用是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同 时对同一个文件进行读、加和写操作的两个程序就有可能会引起冲突。信号量的值永远会正确地加一个“2”--因为有两个线程试图改变它。
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <semaphore.h>
- int myglobal;
- sem_t sem;
- void * thread_function(void *arg)
- {
- int i,j;
- for (i = 0; i < 10; i += 1)
- {
- sem_wait(&sem);
- j = myglobal;
- j = j+1;
- printf(".");
- fflush(stdout);
- sleep(1);
- myglobal = j;
- sem_post(&sem);
- }
- return NULL;
- }
- int main(void)
- {
- pthread_t mythread;
- int i;
- sem_init(&sem, 0, 1);//信号量初始化
- if(pthread_create(&mythread, NULL, thread_function, NULL))
- {
- printf("create thread error!\n");
- abort();
- }
- /* sleep(1);*/
- for(i = 0; i < 10; i++)
- {
- sem_wait(&sem);//=0
- myglobal = myglobal + 1;
- printf("o");
- fflush(stdout);
- sleep(1);
- sem_post(&sem);//=1
- }
- if(pthread_join(mythread, NULL))
- {
- printf("waiting thread failed!\n");
- abort();
- }
- printf("myglobal equals %d\n",myglobal);
- exit(0);
- }
评论暂时关闭