多线程

哈工大计算机网络实验一 :多线程服务器编程

思路:linux下包含头文件#include <pthread.h>

编译的时候加上参数 -lpthread

对于服务器端,服务器对socket处理的部分与接收客户端字符串的部分分开写,

服务器端的主函数中首先使用socket()函数创建socket,然后使用bind()函数将socket与ip地址和端口绑定,

再调用listen()函数设置为监听端口状态和监听的最大值,最后在while(1)循环里写accept()函数,每接收到一个客户端

就响应并且创建一个线程来处理。

服务器端代码:

server_tcp.c

  • Estudantes
  • Linux*
  • Servidor
  • C/C++
  • Principiante
  • 哈工大
  • 服务器socket编程
  • 多线程
  • java socket 多线程网络传输多个文件

         由于需要研究了下用 java socket 传输文件,由于需要传输多个文件,因此,采用了多线程设计。客户端每个线程创建一个 socket 连接,每个 socket 连接负责传输一个文件,服务端的ServerSocket每次 accept 一个 socket 连接,创建一个线程用于接收客户端传来的文件。

    1、服务端

    《多线程服务器的适用场合》-- 例释与答疑

    《多线程服务器的适用场合》(以下简称《适用场合》)一文在博客登出之后,有热心读者提出质疑,我自己也觉得原文没有把道理说通说透,这篇文章试图用一些实例来解答读者的疑问。我本来打算修改原文,但是考虑到已经读过的读者不一定会注意到文章的变动,干脆另写一篇。为方便阅读,本文以问答体呈现。这篇文章可能会反复修改扩充,请注意上面的版本号。

    本文所说的“多线程服务器”的定义与前文一样,同时参见《多线程服务器的常用编程模型》(以下简称《常用模型》)一文的详细界定,以下“连接、端口”均指 TCP 协议。

    1. Linux 能同时启动多少个线程?
    对于 32-bit Linux,一个进程的地址空间是 4G,其中用户态能访问 3G 左右,而一个线程的默认栈 (stack) 大小是 10M,心算可知,一个进程大约最多能同时启动 300 个线程。如果不改线程的调用栈大小的话,300 左右是上限,因为程序的其他部分(数据段、代码段、堆、动态库、等等)同样要占用内存(地址空间)。

    对于 64-bit 系统,线程数目可大大增加,具体数字我没有测试,因为我实际用不到那么多线程。

    以下的关于线程数目的讨论以 32-bit Linux 为例。

    2. 多线程能提高并发度吗?

    多线程服务器的适用场合

    这篇文章原本是前一篇博客《多线程服务器的常用编程模型》(以下简称《常用模型》)计划中的一节,今天终于写完了。

    “服务器开发”包罗万象,本文所指的“服务器开发”的含义请见《常用模型》一文,一句话形容是:跑在多核机器上的 Linux 用户态的没有用户界面的长期运行的网络应用程序。“长期运行”的意思不是指程序 7x24 不重启,而是程序不会因为无事可做而退出,它会等着下一个请求的到来。例如 wget 不是长期运行的,httpd 是长期运行的。

    正名
    与前文相同,本文的“进程”指的是 fork() 系统调用的产物。“线程”指的是 pthread_create() 的产物,而且我指的 pthreads 是 NPTL 的,每个线程由 clone() 产生,对应一个内核的 task_struct。本文所用的开发语言是 C++,运行环境为 Linux。

    首先,一个由多台机器组成的分布式系统必然是多进程的(字面意义上),因为进程不能跨 OS 边界。在这个前提下,我们把目光集中到一台机器,一台拥有至少 4 个核的普通服务器。如果要在一台多核机器上提供一种服务或执行一个任务,可用的模式有:

    运行一个单线程的进程
    运行一个多线程的进程
    运行多个单线程的进程

    多线程服务器的常用编程模型

    本文主要讲我个人在多线程开发方面的一些粗浅经验。总结了一两种常用的线程模型,归纳了进程间通讯与线程同步的最佳实践,以期用简单规范的方式开发多线程程序。

    文中的“多线程服务器”是指运行在 Linux 操作系统上的独占式网络应用程序。硬件平台为 Intel x64 系列的多核 CPU,单路或双路 SMP 服务器(每台机器一共拥有四个核或八个核,十几 GB 内存),机器之间用百兆或千兆以太网连接。这大概是目前民用 PC 服务器的主流配置。

    本文不涉及 Windows 系统,不涉及人机交互界面(无论命令行或图形);不考虑文件读写(往磁盘写 log 除外),不考虑数据库操作,不考虑 Web 应用;不考虑低端的单核主机或嵌入式系统,不考虑手持式设备,不考虑专门的网络设备,不考虑高端的 >=32 核 Unix 主机;只考虑 TCP,不考虑 UDP,也不考虑除了局域网络之外的其他数据收发方式(例如串并口、USB口、数据采集板卡、实时控制等)。

    Java多线程编程要点(二)

    4、 Timer 和 Timer Task 的使用

    Timer 是一种定时器工具,用来在一个后台线程计划执行指定任务,这些任务可以被执行一次,也可以被定期执行。每个 Timer 对象对应一个后台线程,顺序地执行所有计时器任务。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程,从而可能延迟后续任务的执行。对 Timer 对象最后的引用完成并且所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。TimerTask是一个抽象类,实现了Runable接口,它的子类代表一个可以被Timer计划的任务。

    1) 一个简单的Demo,让大家对Timer、TimerTask的使用有感性的认识。



    2) Timer和TimerTask的常用api函数说明



    浅谈Java多线程的同步问题

    多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问。

    下面以一个简单的实例来进行对比分析。实例要完成的工作非常简单,就是创建10个线程,每个线程都打印从0到99这100个数字,我们希望线程之间不会出现交叉乱序打印,而是顺序地打印。

    先来看第一段代码,这里我们在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,但结果并不如我们希望那样,这是因为这里synchronized锁住的是this对象,即当前运行线程对象本身。代码中创建了10个线程,而每个线程都持有this对象的对象锁,这不能实现线程的同步。

    代码
    package com.vista;

    class MyThread implements java.lang.Runnable
    {
    private int threadId;

    public MyThread(int id)
    {
    this.threadId = id;
    }
    @Override
    public synchronized void run()
    {

    Java多线程编程要点 (一)

    1、 认识Thread和Runnable

    Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。在使用Thread的时候只需继承Thread,并且new一个实例出来,调用start()方法即可以启动一个线程。

    Thread Test = new Thread();

    Test.start();

    在使用Runnable的时候需要先new一个实现Runnable的实例,之后启动Thread即可。

    Test impelements Runnable;

    Test t = new Test();

    Thread test = new Thread(t);

    test.start();

    总结:Thread和Runnable是实现java多线程的2种方式,runable是接口,thread是类,建议使用runable实现java多线程,不管如何,最终都需要通过thread.start()来使线程处于可运行状态。

    Python 里的多线程




    今天随意逛水木的精华区,看大家在讨论什么GIL,搜了一下发现python的多线程原来与我想象的大不同。看了几篇不错的文章,觉得挺不错的,大致对问题有了个了解,先把文章的地址贴出来,有兴趣去读这些文章的朋友就不必再听我这样的半拉子扯淡了:


    Concurrency and Python


    http://www.ddj.com/linux-open-source/206103078


    Python Threads and the Global Interpreter Lock


    http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/


     

    本来是应该从并行、多线程、竞争、锁这些东西谈起,不过我想一般大家都该挺熟的,不熟悉的话也很容易找到资料,这里就偷懒略过了。

    浏览器的多线程技术

     


    今天在测试一个东西时发现,谷歌浏览器与IE浏览器可能在多线程处理方面有根本差别。我是指,如果浏览器在等待一个请求的响应时,如果有一部分已经输出到了浏览器中,那么对于这一部分的展现是否可以并行处理?


    例如,我需要等待一个很长时间的页面,为了减少用户的焦虑,我们可能会用一个进度条的方式。这个进度条可能是一个gif图片。我发现在谷歌浏览器中,gif图片可以正常工作(即便浏览器当前还在等待更多的响应),而IE却不行。傲游也不行(因为它也是IE内核)





    可以看到那个进度条在动。


    而同样的页面,如果用IE打开,则一动不动。

    Assine o 多线程