c语言服务器编程方法,C语言服务器编程必备常识

只有互斥量的主人能够解锁它。

线程的堆栈受限。

线程结束方式要么从线程函数return,要么调用pthread_exit,进入终止态,直到被分离或被连接。创建不需要连接的线程应该使用detachstate属性建立线程使其自动分离。

pthread_join会阻塞调用者,直到被join的线程结束,join返回被连接的线程也分离,所以只能被join一次,下一次就错误了。

使用条件变量时必须保证如果有线程等待,则该线程等待后必然会收到信号(if/while)

条件变量可以使线程处于等待状态而不消耗资源。条件变量必须跟一个互斥变量一起使用,因为条件变量就是共享的全局数据??【条件和锁结合共同保护共享数据】status = pthread_cond_wait(&alarm_cond, &alarm_mutex);

没有条件变量,程序员可用使用轮询某个变量来实现停等-通知同步,但是非常消耗系统资源。

如果确定线程不需要被Join, 则申明为Detached可以节省系统资源

pthread_self获得自身的ID,只能通过ID操作线程。main是主线程,主线程停止所有线程也停止,main中调用pthread_exit,这样进程就必须等待所有线程结束才能终止。

通过向pthread_t(ID)=pthread_create传递线程函数地址和函数参数来创建线程。注意当前线程从pthread_create返回前,新创建的线程可能已经运行完毕了。

舀水桶类似一个互斥量:桶用来保护“舀水”临界区【访问临界资源(共享数据?)的那段程序是临界区】。或者将桶理解为:用来确保一次只能由一个人舀水的不变量。

在访问共享数据的代码段周围加锁互斥量,则一次只能有一个线程进入该代码段。

pthread_mutex_t表示互斥量,不能拷贝,可以拷贝指针。

当调用pthread_mutex_lock时,如果互斥量已经被锁住,线程将被阻塞。调用pthread_mutex_trylock时不会阻塞,会返回EBASY,可以做其他的事情去。

互斥量的本质是串行执行。

解决死锁的两种方法:一,规定加锁顺序;二,trylock如果不行回退,解锁所有已加锁的互斥量

sched_yield()将处理器交给另一个等待处理的线程,如果没有等待处理的线程。立即返回。sleep()可以确保其他线程有机会运行。

按照相反的顺序解锁,有助于减少线程做回退操作的可能。因为同一个线程函数中加锁顺序是一样的。对于不同的线程函数顺序应该不重要

线程运行于解锁和阻塞之间时,其他线程才能改变共享数据状态。此时共享状态的改变,本线程是无法知道的。->需要条件变量。队列满,队列空,满空就是条件变量。

动态初始化的条件变量需要pthread_cond_destroy来释放。静态初始化的不必释放。释放前确保其他线程不使用他。

在阻塞线程之前,条件变量等待操作pthread_cond_wait将解锁互斥量,重新返回线程之前,会再次锁住互斥量。子线程只在pthread_cond_wait等待的短时间内可以加锁,修改共享数据,然后解锁。

pthread_cond_timedwait的意思就是我在这里等time时间,如果时间内条件变量变了,或者不变,我都要跳出while(谓词)的循环,按情况处理。

pthread_cond_wait和pthread_cond_signal必须同时发生才能成功。

互斥量:条件变量是 一对多的关系

当线程调用pthread_create时,她所能看到的内存值也是它建立的线程能看到的,之后的线程不一定能看到。

线程解锁互斥量时所看到的的数据,也能被后来直接锁住相同互斥量的线程看到。解锁后写入的数据,不必被其他线程看见(因为那不是用来同步的数据,没必要所有人看见,同步就应该加锁)。

线程终止,取消,从启动函数返回,pthread_exit时看到的数据,能够被连接该线程的其他线程看到。终止后写入的数据不会被看到。

线程发信号或广播时看到的内存数据,可以被唤醒线程看到。之后写入的不会。

线程分配的堆栈和堆空间是私有的,除非传给其他线程指针。register(寄存器变量)和auto变量(大部分变量默认auto)(static变量的生命期长)中的数据可随时读取,像在同步程序中一样

两个处理器将各自的高速缓存中的数据写入主存的顺序是不一定的,即使写到相应高速缓存的顺序有先后之分。同一线程写数据也未必按照顺序刷新进内存,这使得其他线程读取结果不对。

锁住互斥量->内存屏障->内存屏障->解锁互斥量

使用线程的方式:流水线、工作组(工作线程在数据的不同部分操作)、C/S。

pthread_attr_setdetachstate (&_attr, PTHREAD_CREATE_DETACHED);说明在创建线程后,我们不在需要使用线程ID。

不变量(Invariant):程序所做的一些假设,特别是指变量之间的关系。判定条件(Predicates):描述不变量状态的逻辑表达式。

pthread_kill(thdid, SIGTERM)给特定线程发信号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值