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就是一块不可靠内存,可能产生无法预料的错误。
对于代码三:同样原理,可能创建的线程还没执行,主线程已经运行完毕,那么整个进程已经结束了,当然就得不到想要的结果。
所以我们要在创建的线程,使用主线程传过来参数,需要确保创建线程能够启动,同时获取变量内存空间还没释放。
分享到:
相关推荐
4. 线程执行:线程函数是新线程开始执行的地方,执行完后应该调用`jthread_exit`。 5. 线程同步:使用JThread提供的同步机制,如`jthread_mutex_lock`、`jthread_mutex_unlock`等。 6. 线程管理:可以使用`jthread_...
编写多线程程序需要注意的地方包括数据的共享问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击。这正是编写多线程程序时最需要注意的地方。 Linux...
在Linux中,线程是操作系统调度的基本单位,它们共享同一地址空间,这意味着线程间的通信非常高效,但同时也需要注意同步和互斥问题以避免数据竞争。Linux提供了一套名为pthread的API,用于创建、管理和同步线程。 ...
线程入口点函数类似于main()函数,是新线程开始执行的地方。 ```c pthread_t thread_id; int ret = pthread_create(&thread_id, NULL, thread_function, (void*)arg); ``` 四、线程属性 线程属性(pthread_attr_t...
首先,我们需要理解Linux中的多线程概念。在Linux操作系统中,线程是程序执行的基本单元,一个进程可以包含多个线程,它们共享相同的内存空间,但各自拥有独立的执行路径。通过多线程,我们可以同时执行多个任务,...
5. **`pthread_cancel()`**: 可以用来取消正在运行的线程,但需要确保线程是可取消的,并且在适当的地方处理取消请求。 ### 线程安全 线程安全是指在多线程环境下,代码可以正确地执行,不会因为其他线程的活动而...
5. 注意线程同步:使用互斥锁和条件变量时,要确保在正确的地方加锁和解锁,防止数据竞争和不一致状态。 了解和掌握这些经验和技巧,能帮助开发者更高效、安全地编写Linux多线程程序,避免常见的陷阱,提升程序的...
为了保证移植的顺利进行,还需要注意其他因素,如错误处理机制、信号处理、多线程同步、线程安全函数的使用等。同时,了解每个平台的特定习惯和最佳实践也很重要,例如,Windows倾向于使用事件驱动模型,而Linux更...
这个网站可能是一个专门提供Linux学习资源的地方,其中可能包含各种Linux学习材料、教程、实践案例以及可能的免费电子书下载,尤其是Linux编程指南这本电子书。 在实际使用这些资源时,需要注意可能存在的版权问题...
需要注意的是,除了`SCHED_OTHER`之外的调度策略通常只对具有超级用户权限的进程可用。 3. **`__schedparam`**:此属性用于设置线程的优先级,通过一个`struct sched_param`结构体来指定。对于实时调度策略(`SCHED...
需要注意的是,调用`wait()`前必须先获得对象锁,而`sleep()`可以在任何地方调用。 4. **题目4:**如何用Java实现阻塞队列? - **解答要点:**阻塞队列是一种特殊的队列,当队列为空时,从队列获取元素的操作会...
在Linux环境下使用JMeter,我们需要了解以下关键点: 1. **安装JMeter**:首先,需要下载apache-jmeter-5.5.tgz文件并解压。在Linux终端中,可以使用`tar -zxvf apache-jmeter-5.5.tgz`命令进行解压。然后,将解压...
**正文** Java开发工具包(Java Development ...然而,需要注意的是,随着技术的发展,JDK的后续版本(如JDK 8、9、11等)引入了更多新特性和改进,因此在可能的情况下,建议使用最新版本以获取更好的兼容性和性能。
需要注意的是,由于TCP是流式传输,因此可能需要多次调用`recv()`和`send()`以处理完整的数据包。 6. **关闭连接**:当通信完成后,服务器需要关闭通信套接字,释放资源。通常在`handleEcho()`结束后调用`close()`...
在 Linux 平台上编写汇编代码需要注意以下几点: 1. 了解 Linux 的汇编语言语法格式和开发工具 2. 选择合适的汇编语言 formaT(AT&T 或 Intel) 3. 了解汇编语言的优点和缺点 4. 了解 Linux 平台下的汇编语言开发...
#### 六、什么地方需要内存屏障? 在以下场景中通常需要使用内存屏障: - **处理器间交互**:在多处理器系统中,为了确保共享内存区域的一致性。 - **原子操作**:在实现原子操作时,确保操作的完整性。 - **访问...
此外,为了提高效率和防止资源泄露,需要在适当的地方使用`setsockopt()`设置套接字选项,例如设置超时、启用阻塞或非阻塞模式等。 在提供的压缩包文件"tcp"中,可能包含了实现上述步骤的源代码示例,包括服务器端...
14. `strtok`在使用时需要注意,它会修改原字符串,且不支持连续调用。若要处理多个分隔符,可以考虑使用`strsep`。 15. `gets`函数已废弃,因为它可能导致缓冲区溢出,应使用更安全的`fgets`代替。 16. C语言的词法...
需要注意的是,`-rf` 参数表示强制删除且递归处理。 2. **切换目录**: ```bash cd mydir ``` 将当前工作目录切换到 `mydir`。 3. **返回上级目录**: ```bash cd – ``` 返回到上一个工作目录。 4. **...