std::bind
函数
function<void(Socket*)> fun=std::bind(&Server::deleteConnection,this,std::placeholders::_1);
它将 Server类的deleteConnection
成员函数 绑定到一个特定的对象上
奇思妙想:把cppserver的类搞成数据对象,属性,指针是外键
errmsg: Connection refused
开错端口了
第2个客户端没反应【记一次bug】
表现为:
原因:
}else if (bytes_read==-2 && (errno==EAGAIN || errno==EWOULDBLOCK ))//非阻塞IO,这个条件表示数据全部读取完毕
正确写法:
}else if (bytes_read==-1 && (errno==EAGAIN || errno==EWOULDBLOCK ))//非阻塞IO,这个条件表示数据全部读取完毕
第2个客户端没反应【记一次bug】其二
在创建sock时忘记设置为非阻塞IO了。
缓冲区的作用???抽象的好处
条件变量std::condition_variable
C++11 条件变量(condition_variable) 使用详解 - 小海哥哥de - 博客园 (cnblogs.com)!!!!
C++11 条件变量(condition_variable) - 知乎 (zhihu.com)
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:
(1)、一个线程因等待“条件变量的条件成立”而挂起;
(2)、另外一个线程使“条件成立”,给出信号,从而唤醒被等待的线程。
1、有什么用:
当需要死循环判断某个条件成立与否时【true or false】,我们往往需要开一个线程死循环来判断,这样非常消耗CPU。使用条件变量,可以让当前线程wait,释放CPU,如果条件改变时,我们再notify退出线程,再次进行判断。
1、wait函数:
(1)wait(unique_lock <mutex>&lck)
当前线程的执行会被阻塞,直到收到 notify 为止。
(2)wait(unique_lock <mutex>&lck,Predicate pred)
当前线程仅在pred=false时阻塞;如果pred=true时,不阻塞。
wait()可依次拆分为三个操作:释放互斥锁、等待在条件变量上、再次获取互斥锁
2、notify_one():没有参数、没有返回值。
解除阻塞当前正在等待此条件的线程之一。如果没有线程在等待,则还函数不执行任何操作。如果超过一个,不会指定具体哪一线程。
cv.notify_one();会不会产生惊群效应
C++11条件变量:notify_one()与notify_all()的区别-CSDN博客
notify_one():因为只唤醒等待队列中的第一个线程;不存在锁争用,所以能够立即获得锁。其余的线程不会被唤醒,需要等待再次调用notify_one()或者notify_all()。
notify_all():会唤醒所有等待队列中阻塞的线程,存在锁争用,只有一个线程能够获得锁。那其余未获取锁的线程接着会怎么样?会阻塞?还是继续尝试获得锁?
答案是会继续尝试获得锁(类似于轮询),而不会再次阻塞。当持有锁的线程释放锁时,这些线程中的一个会获得锁。而其余的会接着尝试获得锁。
示例
这段代码是一个条件变量的等待操作。cv.wait()函数会在满足指定条件之前一直阻塞当前线程,并且自动释放锁。在这段代码中,条件变量cv与互斥锁uqlock一起使用。
cv.wait(uqlock,[this](){
return stop || !tasks.empty();
});
这里的条件是stop为true或者任务队列tasks不为空。如果满足这个条件,cv.wait()函数会继续执行后面的代码。如果不满足条件,cv.wait()函数会阻塞当前线程,并且自动释放互斥锁uqlock,直到其他线程调用notify系列函数来唤醒当前线程。
总结起来,这段代码的作用是让当前线程等待满足指定条件的时机,并且自动释放互斥锁,以允许其他线程访问共享资源。
多线程错误!
terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permitted
这个错误信息表示在使用std::thread时出现了一个系统错误。错误信息"Enable multithreading to use std::thread: Operation not permitted"意味着无法启用多线程以使用std::thread。
这个错误可能有以下几个原因:
1. 编译器或操作系统不支持多线程:某些编译器或操作系统可能不支持多线程,或者需要特定的编译选项来启用多线程支持。在这种情况下,您需要检查您的编译器和操作系统是否支持多线程,并确保已正确配置编译选项。
2. 缺少必要的库或链接错误:使用std::thread需要链接相应的多线程库,例如pthread库。如果缺少这些库或者链接错误,就会导致无法使用std::thread。您需要确保已正确链接所需的库,并且库文件路径正确。
3. 系统资源限制:有时,操作系统可能会限制可用的系统资源,如线程数目。如果达到了系统资源限制,就无法创建新的线程,从而导致无法使用std::thread。您可以尝试增加系统资源限制或者优化代码以减少线程的使用。
解决方法:
-pthread