`
shadabing
  • 浏览: 24234 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux 线程需要注意地方

阅读更多
1.线程创建函数:

       int pthread_create(pthread_t *restrict thread,  const pthread_attr_t *restrict attr,
      void *(*start_routine)(void*), void *restrict arg);

       我们知道第一个参数线程ID是传出参数,以便调用它的线程能获取其创建线程的ID,根据线程ID所相应的处理,最后一个参数是传入参数,创建的线程可以获取它做相应操作。

       1.我们是否能在创建的线程使用线程ID变量:thread?
        当然不能,使用它存在一定的风险,调用它的线程把创建的线程的ID存放在thread中,不过由于thread是一个传出参数,如果新线程在创建线程返回之前就运行了,那么新线程看到thread的值是未初始化的内容,这个内容并不是正确的 线程ID的内容。一般在创建线程中使用pthread_self(),获取当前创建线程的ID。

       2 传入参数需要注意的地方,从以下程序来分析:
        代码一:

       
  
        #include <stdio.h>
        #include <pthread.h>

         void*  start_thread(void *param) 
         { 
               char *str = (char *)param; 
               printf("s:%s\n",__func__, str);
               return NULL; 
         } 

         pthread_t create_test_thread(char * buf) 
         { 

              pthread_t id =0; 
              pthread_create(&id, NULL, start_thread,buf); 
              return id; 
         } 

         int main(void) 
         { 
               void *ret = NULL; 
               char buf[] ="helloword"; 
               pthread_t id = create_test_thread(buf); 
               pthread_join(id,&ret);  
               return 0; 
          } 

      
         代码二:
         
  
        #include <stdio.h>
        #include <pthread.h>

         void*  start_thread(void *param) 
         { 
               char *str = (char *)param; 
               printf("s:%s\n",__func__, str);
               return NULL; 
         } 

         pthread_t create_test_thread() 
         { 

              pthread_t id =0; 
              char buf[] ="hello world"; 
              pthread_create(&id, NULL, start_thread,buf); 
              return id; 
         } 

         int main(void) 
         { 
               void *ret = NULL; 
               pthread_t id = create_test_thread(); 
               pthread_join(id,&ret);  
               return 0; 
          } 


         代码三:
        
  
        #include <stdio.h>
        #include <pthread.h>

         void*  start_thread(void *param) 
         { 
               char *str = (char *)param; 
               printf("s:%s\n",__func__, str);
               return NULL; 
         } 

         pthread_t create_test_thread(char * buf) 
         { 

              pthread_t id =0; 
              pthread_create(&id, NULL, start_thread,buf); 
              return id; 
         } 

         int main(void) 
         { 
               void *ret = NULL; 
               char buf[] ="helloword"; 
               pthread_t id = create_test_thread(buf); 
               return 0; 
          } 

       
        我们用gcc -o mythread mythread.c -lpthread,并运行./mythread,我们只能从代码一中获取正确的结果,为什么呢?
         代码二中:buf的作用域只限于函数create_test_thread()中,函数执行完毕,buf所指向的空间也就释放了,如果主函数执行完毕,创建线程还没启动,那么创建线程使用的buf就是一块不可靠内存,可能产生无法预料的错误。
         对于代码三:同样原理,可能创建的线程还没执行,主线程已经运行完毕,那么整个进程已经结束了,当然就得不到想要的结果。
         所以我们要在创建的线程,使用主线程传过来参数,需要确保创建线程能够启动,同时获取变量内存空间还没释放。
         

        

       

分享到:
评论

相关推荐

    JThread linux线程库

    4. 线程执行:线程函数是新线程开始执行的地方,执行完后应该调用`jthread_exit`。 5. 线程同步:使用JThread提供的同步机制,如`jthread_mutex_lock`、`jthread_mutex_unlock`等。 6. 线程管理:可以使用`jthread_...

    Linux多线程编程入门[参照].pdf

    编写多线程程序需要注意的地方包括数据的共享问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击。这正是编写多线程程序时最需要注意的地方。 Linux...

    Linux 下多线程编程的详细例子

    在Linux中,线程是操作系统调度的基本单位,它们共享同一地址空间,这意味着线程间的通信非常高效,但同时也需要注意同步和互斥问题以避免数据竞争。Linux提供了一套名为pthread的API,用于创建、管理和同步线程。 ...

    linux多线程编程

    线程入口点函数类似于main()函数,是新线程开始执行的地方。 ```c pthread_t thread_id; int ret = pthread_create(&thread_id, NULL, thread_function, (void*)arg); ``` 四、线程属性 线程属性(pthread_attr_t...

    linux opencv多线程显示

    首先,我们需要理解Linux中的多线程概念。在Linux操作系统中,线程是程序执行的基本单元,一个进程可以包含多个线程,它们共享相同的内存空间,但各自拥有独立的执行路径。通过多线程,我们可以同时执行多个任务,...

    Linux多线程-相关手写笔记

    5. **`pthread_cancel()`**: 可以用来取消正在运行的线程,但需要确保线程是可取消的,并且在适当的地方处理取消请求。 ### 线程安全 线程安全是指在多线程环境下,代码可以正确地执行,不会因为其他线程的活动而...

    Linux的多线程编程的高效开发经验

    5. 注意线程同步:使用互斥锁和条件变量时,要确保在正确的地方加锁和解锁,防止数据竞争和不一致状态。 了解和掌握这些经验和技巧,能帮助开发者更高效、安全地编写Linux多线程程序,避免常见的陷阱,提升程序的...

    win32linux相互移植网络编程需要注意的地方(转).pdf

    为了保证移植的顺利进行,还需要注意其他因素,如错误处理机制、信号处理、多线程同步、线程安全函数的使用等。同时,了解每个平台的特定习惯和最佳实践也很重要,例如,Windows倾向于使用事件驱动模型,而Linux更...

    linux 编程指南 第三版

    这个网站可能是一个专门提供Linux学习资源的地方,其中可能包含各种Linux学习材料、教程、实践案例以及可能的免费电子书下载,尤其是Linux编程指南这本电子书。 在实际使用这些资源时,需要注意可能存在的版权问题...

    Posix线程编程指南

    需要注意的是,除了`SCHED_OTHER`之外的调度策略通常只对具有超级用户权限的进程可用。 3. **`__schedparam`**:此属性用于设置线程的优先级,通过一个`struct sched_param`结构体来指定。对于实时调度策略(`SCHED...

    多线程面试题及回答

    需要注意的是,调用`wait()`前必须先获得对象锁,而`sleep()`可以在任何地方调用。 4. **题目4:**如何用Java实现阻塞队列? - **解答要点:**阻塞队列是一种特殊的队列,当队列为空时,从队列获取元素的操作会...

    jmeter5.5,linux版本测试

    在Linux环境下使用JMeter,我们需要了解以下关键点: 1. **安装JMeter**:首先,需要下载apache-jmeter-5.5.tgz文件并解压。在Linux终端中,可以使用`tar -zxvf apache-jmeter-5.5.tgz`命令进行解压。然后,将解压...

    JDK_1.7_Linux32bit 百度云下载

    **正文** Java开发工具包(Java Development ...然而,需要注意的是,随着技术的发展,JDK的后续版本(如JDK 8、9、11等)引入了更多新特性和改进,因此在可能的情况下,建议使用最新版本以获取更好的兼容性和性能。

    Linux socket 编程入门

    需要注意的是,由于TCP是流式传输,因此可能需要多次调用`recv()`和`send()`以处理完整的数据包。 6. **关闭连接**:当通信完成后,服务器需要关闭通信套接字,释放资源。通常在`handleEcho()`结束后调用`close()`...

    LINUX汇编格式.doc

    在 Linux 平台上编写汇编代码需要注意以下几点: 1. 了解 Linux 的汇编语言语法格式和开发工具 2. 选择合适的汇编语言 formaT(AT&T 或 Intel) 3. 了解汇编语言的优点和缺点 4. 了解 Linux 平台下的汇编语言开发...

    linux 内核内存屏障

    #### 六、什么地方需要内存屏障? 在以下场景中通常需要使用内存屏障: - **处理器间交互**:在多处理器系统中,为了确保共享内存区域的一致性。 - **原子操作**:在实现原子操作时,确保操作的完整性。 - **访问...

    linux c 下TCPsocket完整实例

    此外,为了提高效率和防止资源泄露,需要在适当的地方使用`setsockopt()`设置套接字选项,例如设置超时、启用阻塞或非阻塞模式等。 在提供的压缩包文件"tcp"中,可能包含了实现上述步骤的源代码示例,包括服务器端...

    ( 嵌入式系统 linux工程师 面试题

    14. `strtok`在使用时需要注意,它会修改原字符串,且不支持连续调用。若要处理多个分隔符,可以考虑使用`strsep`。 15. `gets`函数已废弃,因为它可能导致缓冲区溢出,应使用更安全的`fgets`代替。 16. C语言的词法...

    Linux_SSH命令大全

    需要注意的是,`-rf` 参数表示强制删除且递归处理。 2. **切换目录**: ```bash cd mydir ``` 将当前工作目录切换到 `mydir`。 3. **返回上级目录**: ```bash cd – ``` 返回到上一个工作目录。 4. **...

Global site tag (gtag.js) - Google Analytics