linux pthread线程相关,只运行唯一进程相关

Posted mathyk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux pthread线程相关,只运行唯一进程相关相关的知识,希望对你有一定的参考价值。

#include <QCoreApplication>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<dirent.h>
using namespace std;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int count_value = 0;

void * MyFunc(void * arg)

    if(arg == NULL)
    
        printf("param is not allow NULL.\n");
        return NULL;
    
    //加锁--所有线程都能访问的全局变量加锁
    pthread_mutex_lock(&mutex);
    int *pnumx = (int*) arg;
    int i = 0;
    while(i < 1000)
    
        printf("thread%d count=%d\n", *pnumx, count_value++);
        sleep(1);
        i++;
    
    pthread_mutex_unlock(&mutex);
    return NULL;


void * MyFunc2(void * arg)

    if (arg == NULL)
    
        printf("param is not allow NULL!\n");
        return NULL;
    
    //这个锁和myfunc中的锁是同一个锁,myfunc被锁,这里也会被锁
    pthread_mutex_lock(&mutex);
    int * pnumx = (int *) arg;
    int i = 0;
    while (i < 1000)
    
        printf("thread%d count=%d\n", *pnumx, count_value++);
        sleep(1);
        i++;
    
    //解锁
    pthread_mutex_unlock(&mutex);
    return NULL;


//Already running return true.
bool IsSingleProcess ()


    int no_os_flag=1;

#ifdef linux

    no_os_flag=0;

    std::cout<<"It is in Linux OS!"<<endl;

#endif

#ifdef _UNIX

    no_os_flag=0;

    std::cout<<"It is in UNIX OS!"<<endl;

#endif

#ifdef __WINDOWS_

    no_os_flag=0;

    std::cout<<"It is in Windows OS!"<<endl;

#endif

#ifdef _WIN32

    no_os_flag=0;

    std::cout<<"It is in WIN32 OS!"<<endl;

#endif

    if(1==no_os_flag)

        std::cout<<"No OS Defined ,I do not know what the os is!"<<endl;

    


    long pid = 0;
    char full_name[1024] = 0;
    char proc_name[1024] = 0;
    int fd;
    pid = getpid();
    std::cout << "pid = " << pid << " ";
    sprintf(full_name, "/proc/%ld/cmdline", pid);
    if (access(full_name, F_OK) == 0)
    
        fd = open (full_name, O_RDONLY);
        if (fd == -1)
            return false;
        read (fd, proc_name, 1024);
        close (fd);
    
    else
        return false;

    char self_proc_name[512] = 0;
    char * p = proc_name;
    int pt = 0;
    while (*p !=   && *p != \0)
    
        self_proc_name[pt] = *p;
        p++;
        pt++;
    
    string self_final_name = basename(self_proc_name);
    std::cout << " self_final_name = " << self_final_name << std::endl << flush;
    DIR *dir;
    struct dirent * result;
    dir = opendir ("/proc");
    while ((result = readdir (dir)) != NULL)
    
        if (! strcmp(result->d_name, ".") || ! strcmp (result->d_name, "..") || ! strcmp (result->d_name, "thread-self")
                || ! strcmp (result->d_name, "self") || atol (result->d_name) == pid)
            continue;
        memset(full_name, 0, sizeof(full_name));
        memset(proc_name, 0, sizeof(proc_name));
        sprintf(full_name, "/proc/%s/cmdline", result->d_name);
        if (access(full_name, F_OK) == 0)
        
            fd = open (full_name, O_RDONLY);
            if (fd == -1)
                continue;
            read (fd, proc_name, 1024);
            close (fd);
            char *q = proc_name;
            pt = 0;
            memset(self_proc_name, 0, sizeof (self_proc_name));
            while (*q !=   && *q != \0)
            
                self_proc_name[pt] = *q;
                q++;
                pt++;
            
            string other_final_name = basename(self_proc_name);
            if (self_final_name == other_final_name)
            
                cout << "full_name = " << full_name << endl << flush;
                cout << "other_final_name: " << other_final_name << endl;
                return true;
            
        
    
    return false;


int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);

    //condition compile
    #ifdef _WIN32
        if(true == IsSingleProcess())
        
            std::cout << "process is running in another place" << endl << flush;
            return 0;
        
    #else
        if(true == IsSingleProcess())  //Already running return true.
        
            std::cout << "......"<< endl;
            return 0;
        
    #endif

    cout<<".............START............."<<endl;

    pthread_t thr1,thr2;
    pthread_attr_t attr;

    pthread_attr_init(&attr);
    //设置进程为可分离状态
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    int aa = 1, bb = 2;

    //创建线程
    if (pthread_create(&thr1, &attr, MyFunc, &aa) != 0)
    
        printf("create thread is failed ! error message :%s\n",
               strerror(errno));
        return -1;
    
    //释放进程属性对象
    pthread_attr_destroy(&attr);

    if (pthread_create(&thr2, NULL, MyFunc2, &bb) != 0)
    
        printf("create thread is failed ! error message :%s\n",
               strerror(errno));
        return -1;
    
    pthread_join(thr2, NULL);
    printf("main end\n");
    return 0;

    return a.exec();

 

以上是关于linux pthread线程相关,只运行唯一进程相关的主要内容,如果未能解决你的问题,请参考以下文章

Linux--线程

(转载)Linux 线程取消(Pthread_cancel)

linux应用中,在一个进程内如何获取本进程内其它线程的堆栈信息、

Linux 上的线程标识

Linux多线程操作pthread_t

Linux多线程操作pthread_t