linux下的POSIX C 多线程编程 helloworld

本文介绍了在Linux环境下使用POSIX标准的pthread库进行多线程编程的基本步骤,通过一个简单的 HelloWorld 示例展示如何编译和运行。推荐的学习资源包括优快云上的相关教程链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#define MAX 10

pthread_t thread[2];
pthread_mutex_t mut;
int number = 0;
int i;

void* thread1( void *param )
{
        printf( "thread1: I'm thread 1\n " );
        for( i = 0; i < MAX; i++ )
        {
                printf( "thread1: number = %d\n", number );
                pthread_mutex_lock( &mut );
                        ++number;
                pthread_mutex_unlock( &mut );
                sleep( 2 );
        }

        printf( "thread1: 主函数等我完成任务吗? \n " );
        pthread_exit( NULL );

        return ( void* )0;
}

void* thread2( void* param )
{
        printf( "thread2: I'm thread 2\n" );
        for( i = 0; i < MAX; i++ )
        {
                printf( "thread2: number = %d\n", number );
                pthread_mutex_lock( &mut );
                        ++number;
                pthread_mutex_unlock( &mut );
                sleep( 3 );
        }

        printf( "thread2: 主函数在等我完成任务吗? \n" );
        pthread_exit( NULL );

        return ( void* )0;
}

void thread_create( void )
{
        int temp;
        memset( &thread, 0, sizeof( thread ) );

        // 创建线程1
        if( ( temp = pthread_create( &thread[0], NULL, thread1, NULL ) ) != 0 )
        {
                printf( "线程1创建失败!\n" );
        }
        else
        {
                printf( "线程1被创建\n" );
        }

        // 创建线程2
        if( ( temp = pthread_create( &thread[1], NULL, thread2, NULL ) ) != 0 )
        {
                printf( "线程2创建失败!\n" );
        }
        else
        {
                printf( "线程2被创建\n" );
        }
}

void thread_wait( void )
{
        // 主函数等待线程1结束
        if ( thread[0] != 0 )
        {
                pthread_join( thread[0], NULL );
                printf( "线程1已经结束\n" );
        }

        // 主函数等待线程2结束
        if ( thread[1] != 0 )
        {
                pthread_join( thread[1], NULL );
                printf( "线程2已经结束\n" );
        }
}

int main()
{
        // 初始化互斥锁
        pthread_mutex_init( &mut, NULL );

        printf( "我是main函数,正在创建线程...\n" );
        thread_create();

        printf( "我是主函数,正在等待线程完成任务...\n" );
        thread_wait();

        printf( "main函数已退出\n" );
        return 0;
}

// main output1 

我是main函数,正在创建线程...
线程1被创建
线程2被创建
我是主函数,正在等待线程完成任务...
thread1: I'm thread 1
 thread2: I'm thread 2
thread1: number = 0
thread2: number = 0
thread1: number = 2
thread2: number = 3
thread1: number = 4
thread2: number = 5
thread1: number = 6
thread1: number = 7
thread2: number = 8
thread1: number = 9
thread2: number = 10
thread1: 主函数等我完成任务吗?
 线程1已经结束
thread2: 主函数在等我完成任务吗?
线程2已经结束
main函数已退出

// main output2

我是main函数,正在创建线程...
线程1被创建
线程2被创建
我是主函数,正在等待线程完成任务...
thread1: I'm thread 1
 thread1: number = 0
thread2: I'm thread 2
thread2: number = 1
thread1: number = 2
thread2: number = 3
thread1: number = 4
thread2: number = 5
thread1: number = 6
thread1: number = 7
thread2: number = 8
thread1: number = 9
thread2: number = 10
thread1: 主函数等我完成任务吗?
 线程1已经结束
thread2: 主函数在等我完成任务吗?
线程2已经结束
main函数已退出


g++编译命令如下: g++ -lpthread -o helloworld.out helloworld.cpp


问题:两个线程共同完成任务,但是对于 共享变量 i 没有互斥加锁操作, 所以以上多线程程序还是存在问题的!


为了达到兼容可移植的目的,POSIX给出了C语言下的多线程编程库 pthread,具体的学习资料请参考一下链接

http://blog.youkuaiyun.com/future_fighter/article/details/3865071

http://blog.youkuaiyun.com/sunboy_2050/article/details/5921003

http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值