用信号量进行线程同步: #include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void *thread_function(void *arg);
sem_t bin_sem;
#define WORK_SIZE 1024
char work_area(WORK_SIZE);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif) int main() {
int res;
pthread_t a_thread;
res = sem_int(&bin_sem,0,0);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(res !=0 ) {
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
res = pthread_create(&a_thread,NULL,thread_function,NULL);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(res != 0) {
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
printf("Input some text.Enter 'end' to finish\n");
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while(strncmp("end",work_area,3)!=0) {
fgets(work_area,WORK_SIZE,stdin);
sem_post(&bin_sem);
}
printf("\nWaiting for thread to finish \n");
res=pthread_join(a_thread,&thread_result);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(res != 0) {
perror("Thread join failed");
exit(EXIT_SUCCESS);
}
printf("Thread joined\n");
sem_destroy(&bin_sem);
exit(EXIT_SUCCESS);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void *thread_function(void *arg) {
sem_wait(&bin_sem);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while("end",work_area, 3) {
printf("You input %d characters\n" ,strlen(work_area)-1);
}
pthread_exit(NULL);
}
用互斥量进行同步: #include <pthread.h>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr );
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int pthread_mutex_lock(pthread_mutex_t *mutex);//试图对互斥量加锁,如果它已经被锁住,这个调用将被阻塞直到锁被释放为之。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int pthread_mutex_unlock(pthread_mutex_t *mutex);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int pthread_mutex_destroy(pthread_mutex_t *mutex);
线程的属性: 取消一个线程:
|