首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux下多线程机制(2)

Linux下多线程机制(2)

3 解锁


int pthread_mutex_unlock(pthread_mutex_t *mutex); //如果某个线程正在等待加锁,那么这线程进入就绪态


#include


#include

int a[10] = { 0 }; ///共享资源


int i;


pthread_mutex_t mutex;


void *fun1()


{


while(1)


{


int i;


pthread_mutex_lock(&mutex);


for(i = 0; i < 10; i++)


{


a = i;


}


sleep(2);


for(i = 0; i < 10; i++)


{


printf("a[%d] is %d\n", i, a);


}


pthread_mutex_unlock(&mutex);


sleep(1);


}


}


void *fun2()


{


while(1)


{


sleep(1);


pthread_mutex_lock(&mutex);


for(i = 0; i < 10; i++)


{


a = 1;


}


pthread_mutex_unlock(&mutex);


}


}


int main()


{


pthread_t id1, id2;


pthread_mutex_init(&mutex, NULL);


pthread_create(&id1, NULL, fun1, NULL);


pthread_create(&id2, NULL, fun2, NULL);


pthread_join(id1, NULL);


}


////////信号量 (semaphore 简写 sem)


同样可以解决共享资源互斥和同步的问题


信号量可以控制多个共享资源被访问互斥的问题


#include


sem_t sem;


1 创建信号量(初始化信号量)


int sem_init(sem_t *sem, int pshared, int value);


sem [出参], 在创建信号量时,传出的信号量结构体


pshared 通常写0,代表此信号量在多线程之间使用


value 共享资源个数


sem_init(&sem, 0, 3);


sem_init(&sem, 0, 1);


sem_init(&sem, 0, 0);


2 请求信号量


sem_wait(&sem); //如果共享资源个数不为0, 请求成功,使用共享资源,然后共享资源个数-1


//当共享资源个数为0时,请求失败,阻塞


3 释放信号量


sem_post(&sem); //释放信号量,如果有线程正在阻塞等待信号量,那么阻塞解除,


//如果没有线程正在等待信号量,共享资源个数+1


四个线程共享信号量实例


sem_init(&sem, 0, 3); //表示共享资源个数有三个


线程A 调用sem_wait(&sem); //共享资源个数-1, 2


线程B 调用sem_wait(&sem); //共享资源个数-1, 1


线程C 调用sem_wait(&sem); //共享资源个数-1, 0


线程D 调用sem_wait(&sem); //共享资源个数已经为0, 线程D阻塞


如果线程A 调用sem_post(&sem); //线程D 解除阻塞


线程属性


线程可以设置堆栈大小,可以设置线程优先级


默认情况堆栈大小(有些系统1M, 有些2M, 有些4M, 有些8M)


如果定义一个局部变量占用空间特别大,要改堆栈大小


测试线程堆栈大小


#include

#include


void *fun()


{


int a[1000000]; //约等于 4M 1M 1024k 1k 1024B


while(1)


{


printf("thread 1\n");


sleep(1);


}


}


int main()


{


pthread_t id1;


pthread_create(&id1, NULL, fun, NULL);


pthread_join(id1, NULL);


}


pthread_create(pthread_t *thread, pthread_attr_t *attr, void*(*start_routine)(void *), void *arg);


第二个参数 pthread_attr_t *attr; 线程属性,默认NULL


1 获得线程默认属性,赋值给attr


pthread_attr_t attr;


pthread_attr_init(&attr); // 功能:获取线程的默认属性,会更改attr的值,给一个默认值


2 设置线程的堆栈大小属性


pthread_attr_setstacksize(&attr, 14000000); ///功能:设置堆栈大小属性


#include

#include


void *fun()


{


int a[1000000]; //约等于 4M 1M 1024k 1k 1024B


while(1)


{


printf("thread 1\n");


sleep(1);


}


}


int main()


{


pthread_t id1;


pthread_attr_t attr;


pthread_attr_init(&attr); // 功能:获取线程的默认属性,会更改attr的值,给一个默认值


pthread_attr_setstacksize(&attr, 14000000); ///功能:设置堆栈大小属性


pthread_create(&id1, &attr, fun, NULL);


pthread_join(id1, NULL);


}


继承事业,薪火相传
返回列表