pthread相同的ID并输出self_t

时间:2015-01-10 19:06:46

标签: c pthreads

我希望我会非常明确地提出我的问题,我正在编程pthread,简单地说,我计算所需的线程数,并将创建的线程传递给函数然后返回,该函数确实在不同的块上转置;所以每个线程都有自己的块。

要检查我发送不同的线程,我运行pthread_t self_t,但面临两个问题: 似乎只使用了一个相同的线程,并且我总是有关于selt_t的类型输出的警告消息,下面的代码简化显示主要品脱。 我出错的任何想法?

首先是struct和main:

pthread_mutex_t mutexZ;       // Mutex initialize
int array[nn][nn];

struct v
{
  int i, j; // threaded Row,Col
  int n, y; // 
  int iMAX; // 
};

void *transposeM(void *arg);

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

  int Thread_Num = 10; 
  pthread_t t_ID[Thread_Num]; // the number of threads depending on # blocks

  printf("Thread_Num %d\n", Thread_Num);

  struct v *data = (struct v *) malloc(sizeof(struct v));

  int i, j; //loop varables

  //#############################################################
  printf("Matrix Initial before Transpose Done\n"); 
  // printing the Matrix Before any transpose if needed testing

 for (i = 0; i < nn; i++){
  for(j = 0; j< nn; j++){
    array[i][j] = i*nn + j;
    printf("%d ", array[i][j]); 
   }
   printf("\n");}


  //************************************************************/
  // Initialize the mutex 
  pthread_mutex_init(&mutexZ, NULL);
  pthread_attr_t attr; //Set of thread attributes
  pthread_attr_init(&attr);

  int n, y; // Loop Variables for tiling 

  //************************************************************/ 
  //Start of loop transpose:

  int start = 0;

  for (n = 0; n < nn; n += TILE) 
  {
    data->n = n; // row

    for (y = 0; y <= n; y += TILE) {
      data->y = y; // column

      printf("y Tile:%d  \n", y);
      printf("Start before:%d  \n", start);

      //Transpose the other blocks, thread created for each Block transposed

      pthread_create(&(t_ID[start]), NULL, transposeM, (void*) data); // Send the thread to the function
      pthread_join(t_ID[start], NULL);

      if (start < Thread_Num)
      {
        start = start + 1;

      }
      printf("Start after:%d  \n", start);

    } // End the Y column TileJump loop
  } // End of n Row TileJump loop
} 

根据笔记进行修改,

void *transposeM(void *arg)
{
  // Transposing the tiles
  struct v *data = arg;
  int i, j; //loop row and column
  int temp = 0;
  pthread_mutex_lock(&mutexZ); //lock the running thread here,so keeps block until thread that holds     mutex releases it

  pthread_t self_t; // To check the thread id - my check not Mandetory to use
  self_t = pthread_self();
  printf("Thread number Main = %u \n ", self_t); //here we used u% coz seems the pthread_t is unsigned long data type

  //*******************************************************
  //here some function to work
  //########################################################

  pthread_mutex_unlock(&mutexZ);
  pthread_exit(NULL);

  return (NULL);

} // End

1 个答案:

答案 0 :(得分:0)

您的代码存在两个概念问题:

  1. 您将相同的引用/添加者传递给每个线程,使每个线程处理相同的数据。
  2. 您在创建线程后立即加入该线程。作为连接块直到要连接的线程结束,这会使所有线程的运行顺序化。
  3. 为了解决问题1.创建了data指向每个线程的唯一实例。

    修复2.将调用移至pthread_join(),从而创建线程,并在创建循环后将其置于第二个循环运行中。

    ...
    
    printf("Thread_Num %d\n", Thread_Num);
    
    pthread_t t_ID[Thread_Num]; // the number of threads depending on # blocks
    struct v data_ID[Thread_Num] = {0}; // define an instance of data for ech thread
    
    ...
    
    for (n = 0; n < nn; n += TILE) //limit of row
    {
      struct v * data = data_ID + start; // assign thread specific instance
    
      data->n = n; // row
    
      for (y = 0; y <= n; y += TILE) // limit of column -here removd the =n, then diagonal tile is not     transposed
      {
        ...
        pthread_create(&(t_ID[start]), NULL, transposeM, (void*) data); // Send the thread to the function
        ...
      }
    } // End the Y column TileJump loop
    
    for (;start >= 0; --start)
    {
      pthread_join(t_ID[start], NULL);
    }
    
    ...
    

    对线程功能的修改:

    void *transposeM(void *arg)
    {
      struct v *data = arg;
    
      ...
    
      pthread_t self = pthread_self(); // better naming
    
      ...
    
      pthread_exit(NULL); // the thread functions exits here.
    
      return NULL; // this is never reached, but is necessary to calm down thr compiler.
    } // End