在C ++中的线程之间共享列表

时间:2019-05-22 20:00:47

标签: c++ linux multithreading

我在使用C ++在2个或更多线程之间共享列表时遇到问题。我在main()中初始化列表,然后创建线程,将列表对象指针作为参数传递:

pthread_create(&(tid[i]), NULL, &threadfunction, &l);

其中&l是参数。这是从2个或更多线程中操作相同列表的正确方法吗?我使用一个简单的互斥锁来进行锁定/解锁,因此一次最多只能访问一个线程。

编辑:下面的代码


#include <stdio.h> 
#include <string.h> 
#include <pthread.h> 
#include <stdlib.h> 
#include <unistd.h>
#include "list.h" 

using namespace std;
int count = 0;
pthread_t tid[2]; 
pthread_mutex_t lock; 

void* trythis(void *arg) 
{ 
    pthread_mutex_lock(&lock); 
    printf("Starting thread\n");
    count++;
    printf("%d\n", count);
    if(count == 1)
    {
        ((list *)arg)->Append((char *)"some", (char *)"thing");
        printf("Appending done\n");
    }
    else
    {
        ((list *)arg)->Append((char *)"some", (char *)"else");
        printf("Appending done\n");
    }

    pthread_mutex_unlock(&lock); 

    return NULL; 
} 

int main(void) 
{ 
    list* l = new list();
    int i = 0; 
    printf("Starting\n");
    if (pthread_mutex_init(&lock, NULL) != 0) 
    { 
        printf("mutex init has failed\n"); 
        return 1; 
    } 

while(i < 2) 
{ 
    int err = pthread_create(&(tid[i]), NULL, &trythis, &l); 
    if (err != 0) 
        printf("\nThread can't be created :[%s]", strerror(err)); 
    i++; 
} 

pthread_join(tid[0], NULL); 
printf("Im out 1\n");
pthread_join(tid[1], NULL); 
printf("Im out 2\n");

pthread_mutex_destroy(&lock); 

delete l;
return 0; 

}


Append()函数只是在列表中添加一些元素(每个列表节点都有2个char *成员)。

2 个答案:

答案 0 :(得分:2)

在:

thread_create(&(tid[i]), NULL, &trythis, &l); 

它传递类型为l的局部变量list*的地址,以便trythis函数获取list**并将其错误地转换为list*

通过值传递l

thread_create(&(tid[i]), NULL, &trythis, l); 

答案 1 :(得分:0)

也许可以确保您要传递的数据在线程的生存期内有效?如果在线程使用完该线程之前将其销毁,则将导致不确定的行为。

当您想将相同的pthread_create与不同的参数重用时,start_routine的最后一个参数只是一种方便。线程只需引用相同的变量即可共享数据。