pthread

线程3——信号量

霸气de小男生 提交于 2019-12-01 08:51:01
创建信号量,并赋予初值 int sem_init(sem_t *sem, int pshared, unsigned int value); 销毁信号量 int sem_destroy(sem_t *sem); 阻塞,信号量数值-1 int sem_wait(sem_t *sem); 非阻塞申请 int sem_trywait(sem_t *sem); 计时申请一个信号量 int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); 发送信号量,数值 +1 int sem_post(sem_t *sem); 获取信号量值 int sem_getvalue(sem_t *sem, int *sval); 示例:和互斥锁案例相同 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <semaphore.h> 5 6 7 void* task1(void *arg); 8 void* task2(void *arg); 9 void* task3(void *arg); 10 11 static int i = 10 ; 12 static sem_t sem; //信号量指针 13 14 15 int main

线程2——条件变量

╄→гoц情女王★ 提交于 2019-12-01 08:44:31
动态创建条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); 注销一个条件变量 int pthread_cond_destroy(pthread_cond_t *cond); 无条件等待 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 计时等待 int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec*abstime); 发送单个条件变量成立信号 int pthread_cond_signal(pthread_cond_t *cond) 广播条件变量成立信号 int pthread_cond_ broadcast (pthread_cond_t *cond) 1 #include <pthread.h> 2 #include <stdio.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 #include <sys/time.h> 6 //声明两个线程 7 void* task1(void *arg); 8

线程

萝らか妹 提交于 2019-12-01 07:55:29
头文件 : #include <pthread.h> 创建新线程函数 : int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 结束线程函数 : void pthread_exit(void *retval); 等待线程结束: int pthread_join(pthread_t thread, void **retval); 创建互斥锁 pthread_mutex_t *mutex pthread_mutex_init(互斥锁指针,NULL) //线程互斥锁加锁 int pthread_mutex_lock(pthread_mutex_t *mutex) //线程互斥锁解锁 int pthread_mutex_unlock(pthread_mutex_t *mutex) //线程互斥锁销毁 int pthread_mutex_distory(pthread_mutex_t *mutex) 案例:分别用三个线程打出1-30报数 1 #include <pthread.h> 2 #include <stdio.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 /

c语言thread用法记录。

对着背影说爱祢 提交于 2019-12-01 04:56:10
显示c++11之前的 1.最基础,进程同时创建5个线程,各自调用同一个函数 #include <iostream> #include <pthread.h> //多线程相关操作头文件,可移植众多平台 using namespace std; #define NUM_THREADS 5 //线程数 void* say_hello( void* args ) { cout << "hello..." << endl; } //函数返回的是函数指针,便于后面作为参数 int main() { pthread_t tids[NUM_THREADS]; //线程id for( int i = 0; i < NUM_THREADS; ++i ) { int ret = pthread_create( &tids[i], NULL, say_hello, NULL ); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数 if( ret != 0 ) //创建线程成功返回0 { cout << "pthread_create error:error_code=" << ret << endl; } } pthread_exit( NULL ); //等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态 } 输入命令:g++ -o muti_thread

iOS 十种线程锁

我们两清 提交于 2019-12-01 04:34:11
锁 是什么意思? 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生。 这里顺便提一下,上锁的两种方式trylock和lock使用场景: 当前线程锁失败,也可以继续其它任务,用 trylock 合适 当前线程只有锁成功后,才会做一些有意义的工作,那就 lock,没必要轮询 trylock 注:以下大部分锁都会提供trylock接口,不再作解释 性能图 <准备操作> 测试代码 #define RHTICK NSDate *startTime = [NSDate date]; #define RHTOCK NSLog(@"==========Time: %f", -[startTime timeIntervalSinceNow]); NSUInteger count = 1000*10000;//执行一千万次 RHTICK for(int i=0; i<count; i++) { 加锁 解锁 } RHTOCK 注:测试中执行时间会波动,所以我取的平均值. 一、OSSpinLock (自旋锁) 测试中效率最高的锁, 不过经YYKit作者确认, OSSpinLock已经不再线程安全,OSSpinLock有潜在的优先级反转问题. 不再安全的 OSSpinLock ; 0.097348s

【从入门到放弃-MySQL】数据库连接过程分析

陌路散爱 提交于 2019-12-01 00:24:17
前言 上周出现了几次连接超时、连接池满还有dbc连接事务模板失败的问题。所以有必要深入了解下MySQL的连接过程。 正好,上周研究了怎么用 Clion调试MySQL源码 ,接下来通过调试来研究一下吧。 服务端 启动 sql/main.cc 123 extern int (int argc, char **argv);int main(int argc, char **argv) { return mysqld_main(argc, argv); } main:入口文件,仅调用了mysqld_main函数 sql/mysqld.cc 12345678910111213141516 int (int argc, char **argv){if (my_init()) { ... } ... if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv, &argv_alloc)) { ... } mysqld_socket_acceptor->connection_event_loop(); mysqld_exit(signal_hand_thr_exit_code);} mysql_main:MySQL服务端启动逻辑的主要处理函数 my_init:系统库和线程初始化 load_defaults:加载my

【从入门到放弃-MySQL】数据库连接过程分析

前提是你 提交于 2019-12-01 00:09:14
前言 上周出现了几次连接超时、连接池满还有dbc连接事务模板失败的问题。所以有必要深入了解下MySQL的连接过程。 正好,上周研究了怎么用 Clion调试MySQL源码 ,接下来通过调试来研究一下吧。 服务端 启动 sql/main.cc 123 extern int (int argc, char **argv);int main(int argc, char **argv) { return mysqld_main(argc, argv); } main:入口文件,仅调用了mysqld_main函数 sql/mysqld.cc 12345678910111213141516 int (int argc, char **argv){if (my_init()) { ... } ... if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv, &argv_alloc)) { ... } mysqld_socket_acceptor->connection_event_loop(); mysqld_exit(signal_hand_thr_exit_code);} mysql_main:MySQL服务端启动逻辑的主要处理函数 my_init:系统库和线程初始化 load_defaults:加载my

【从入门到放弃-MySQL】数据库连接过程分析

谁说我不能喝 提交于 2019-12-01 00:04:58
前言 上周出现了几次连接超时、连接池满还有dbc连接事务模板失败的问题。所以有必要深入了解下MySQL的连接过程。 正好,上周研究了怎么用 Clion调试MySQL源码 ,接下来通过调试来研究一下吧。 服务端 启动 sql/main.cc 123 extern int (int argc, char **argv);int main(int argc, char **argv) { return mysqld_main(argc, argv); } main:入口文件,仅调用了mysqld_main函数 sql/mysqld.cc 12345678910111213141516 int (int argc, char **argv){if (my_init()) { ... } ... if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv, &argv_alloc)) { ... } mysqld_socket_acceptor->connection_event_loop(); mysqld_exit(signal_hand_thr_exit_code);} mysql_main:MySQL服务端启动逻辑的主要处理函数 my_init:系统库和线程初始化 load_defaults:加载my

线程锁

江枫思渺然 提交于 2019-11-30 21:36:38
pthread_t pid1,pid2; pthread_mutex_t mut; //定义一个线程锁 void *fun(void *arg) {   pthread_mutex_lock(&mut); //上锁   :   pthread_mutex_unloc(&mut); //解锁 } int main { pthread_mutex_init(&mut,NULL); //默认属性初始化线程锁 pthread_create(&pid1,NULL,fun,NULL); pthread_join(pid1,NULL); //等待线程pid1结束 return 0; } 2019-10-09 来源: https://www.cnblogs.com/xxxsea/p/11641253.html

使用gdb调试c++程序

守給你的承諾、 提交于 2019-11-30 12:48:02
上篇( 使用c++开发跨平台程序 )说到 , 我不怕造东西 , 我怕的是造出来的东西 , 如果出了问题 , 我却不知道原因 . 所以调试分析是一个重要的手段 . C++ 调试是一个复杂的活 . 虽然大部分调试可以通过 IDE 在开发期间就解决了 . 但是必然的 , 还有很多东西需要在生产环境中还原它 . 分析它 , 然后解决它 .gdb 是一个成熟的工具 . 围绕着它有很多的工具可以选择 . 不过这么多工具的根本还是命令行模式下的 gdb. 废话不多说 , 现在我就用 gdb 来分析调试一下吧 . 生成 dump 文件 : 在 shell 中输入命令 : ulimit -c unlimited; 然后运行自己的程序 , 如果程序此时崩溃 , 就会在目录生成一个名为 core 的文件 .( 这个也看系统配置 .) 使用命令 gdb Test1 core 加载文件 . 或者它的详细命令 gdb -c core -e Test1 --symbols Test1 --readnow 下面是一个命令行输出的截图 : 上图中可以解释的不多 . 因为我们现在刚要入门 . 所以只能注意上图中的三个红框 . 红框 1: 命令行其中 app7 是可执行文件 , 而 core 是 dump 文件 . 红框 2: 标明 gdb 在 app7 中找到了它对应的 symbol. 红框 3: 标明 core