Administrator
发布于 2023-10-06 / 10 阅读 / 0 评论 / 0 点赞

10月6日

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


评论